我可以对浮点表示法错误做些啥? [复制]
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 时,我可以做些啥来克服下面列出的多个错误?