我可以对浮点表示法错误做些啥? [复制]

Posted

技术标签:

【中文标题】我可以对浮点表示法错误做些啥? [复制]【英文标题】: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 float 有6 to 9 significant decimal digits precision,您的号码1000009.00 是9 位数字。您已经超过了float 的精度。请改用double(15–17 位)或BigDecimal(无限精度)。 一般来说,在 base10 中的精确小数很重要的计算中,不要使用浮点数(例如金钱),它会在某个时候咬你,特别是如果你不是 100% 确定并且精通浮点的详细工作原理。 【参考方案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 现在呢?

以上是关于我可以对浮点表示法错误做些啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我必须对我的 xampp (Windows) 上的 OpenSSL 扩展工作做些啥? :( [复制]

在尝试将我的 iOS 应用程序提交到 App Store 时,我可以做些啥来克服下面列出的多个错误?

我必须对我的代码做些啥,以便它只会在数据库中不存在电子邮件的情况下创建帐户? [复制]

返回响应后做些啥?

修复表格装饰器错误后我们应该做些啥不同的事情?

我想创建 React Native App,但收到此错误。我能做些啥?