【问题标题】:What can I do against floating point notations Errors? [duplicate]我可以对浮点表示法错误做些什么? [复制]
【发布时间】:2017-06-02 17:52:47
【问题描述】:

我需要将float 乘以100 才能将 转换为cents。我遇到的问题是,大数字的值没有正确计算。

例如:

String aa = "1000009.00";
aa = aa.replaceAll(",", ".");
float bb = Float.parseFloat(aa);
bb=Math.round(bb*100);
System.out.println(bb);

我得到的是:1.00000896E8

所以我知道这是因为 float 在 Java 中的工作方式。 我一直在寻找答案,但人们总是说“使用Math.round()”,这对我不起作用。

我能做些什么来防止这种情况发生?

【问题讨论】:

  • 使用double 而不是float
  • 或者更好地使用BigDecimal而不是float
  • float6 to 9 significant decimal digits precision,您的号码1000009.00 是9 位数字。您已经超过了float 的精度。请改用double(15–17 位)或BigDecimal(无限精度)。
  • 一般来说,在 base10 中的精确小数很重要的计算中,不要使用浮点数(例如金钱),它会在某个时候咬你,特别是如果你不是 100% 确定并且精通浮点的详细工作原理。

标签: java floating-point multiplication floating-accuracy


【解决方案1】:

您可以使用double 以获得更高的精度(如果您希望处理非常大的数字,则可以使用BigDecimal)。

String aa = "1000009.00";
double bb = Double.parseDouble(aa);
bb=Math.round(bb*100);
System.out.printf("%.2f", bb); // it prints only two digits after the decimal point

输出

100000900.00

【讨论】:

  • 谢谢!
【解决方案2】:

例如,您可以使用BigDecimal::multiply

String aa = "1000009.00";
aa = aa.replaceAll(",", ".");
BigDecimal fullValue = new BigDecimal(aa);

System.out.println("full value  = " + fullValue.multiply(new BigDecimal(100)));

输出

full value  = 100000900.00

【讨论】:

  • 为什么要投反对票?
  • 如果你使用BigDecimal,你应该从aa创建它,而不是bb,然后使用movePointRight(2)得到100000900的正确答案。
  • 谢谢@Andreas 我没有正确阅读问题现在检查我的答案吗?
  • 还是不正确,因为1000009.00乘以100应该是100000900
  • @Andreas 现在呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
相关资源
最近更新 更多