Java中BigDecimal使用scaleByPowerOfTen()提升小数点后出现“E+*”问题踩坑

项目场景:

当前在做个抽卡模拟插件,需要输出概率百分比。
因为Float或者Double计算总会有些精度问题,所以使用BigDecimal储存小数进行计算

问题描述:

原本通过 BigDecimal.scaleByPowerOfTen(2)来进行计算*100,发现输出字符串中多出了类似"E+1"之类的额外内容
在这里插入图片描述

原因分析:

Debug发现问题在scaleByPowerOfTen(2)这里
在这里插入图片描述
另外注意到450抽和500抽(BigDecimal)rollProb的输出数值都为0.2,但是经过相同处理后一个输出正常,一个异常。而且700抽中对(BigDecimal)rollProb进行直接赋值后也出现了相同问题。

450抽及之前的都是通过new BigDecimal(0)后通过BigDecimal.add()累加上来的。
500抽及700抽通过new BigDecimal("(概率)")后再进行赋值,可能和使用字符串初始化有关。

解决方案:

只能判断是scaleByPowerOfTen()或可能使用字符串初始化的问题,不知道如何解决。搜索之后发现stackoverflow有示例符合我当前遇到的问题。
于是将scaleByPowerOfTen(2)更换成movePointRight(2),结果可以正常输出了
在这里插入图片描述
提问截图:
在这里插入图片描述
原链接:https://stackoverflow.com/questions/25454734/what-is-the-difference-between-bigdecimal-movepointright-and-scalebypoweroften


版权声明:本文为qq_41046428原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。