Java 将double.valueOf(String)*100相乘会对某些数字产生不好的结果

Java 将double.valueOf(String)*100相乘会对某些数字产生不好的结果,java,Java,我试图使用double.valueOfString的函数将字符串转换为double,并将其乘以100。结果适用于大多数数字,但有些数字除外。例如,如果金额是10.20,我使用Double.valueOf10.20*100,结果是1019.9999,而不是1020.0。这只发生在10.20,8.20,9.20。它在7.20、1.20、11.20等情况下运行良好。原因是什么?下面是我的代码片段 第一种情况 字符串s=10.20; *System.out.PrintLn双操纵后的值为+double.v

我试图使用double.valueOfString的函数将字符串转换为double,并将其乘以100。结果适用于大多数数字,但有些数字除外。例如,如果金额是10.20,我使用Double.valueOf10.20*100,结果是1019.9999,而不是1020.0。这只发生在10.20,8.20,9.20。它在7.20、1.20、11.20等情况下运行良好。原因是什么?下面是我的代码片段

第一种情况

字符串s=10.20; *System.out.PrintLn双操纵后的值为+double.valueOffirstHalf 100

结果:-两次手动操作后的值为1019.999999999

其中,实际结果应为1020.0。如果我给出以下信息,它就可以正常工作

第二种情况

*字符串s=7.20; System.out.PrintLn双操纵后的值为+double.valueOffirstHalf 100

结果:-两次操作后的值为720.0

如有任何帮助,请使用BigDecimal


因为Java使用二进制浮点数标准来表示浮点数,所以会得到不好的结果。并非每个十进制数都可以表示为二进制分数。 必须使用java.math.BigDecimal 这里已经解释过:

确保对浮点数使用BigDecimalString构造函数,避免使用BigDecimaldouble构造函数:
新的BigDecimal10.20.multiplynew BigDecimal100.toString

还不错。只需适当设置数字格式,即小数精度有限,比如说,0,它看起来应该再次正常。不管怎样,看到了吗
BigDecimal newValue = BigDecimal.valueOf(10.20)
   .setScale(2, RoundingMode.HALF_UP)
   .multiply(BigDecimal.valueOf(100));