【发布时间】:2014-09-28 20:37:02
【问题描述】:
假设我有以下代码:
double factor;
double num = 4.35;
BigDecimal y = new BigDecimal(num);
BigDecimal n = new BigDecimal(factor);
BigDecimal asBigDecimal = y.multiply(n);
double asDouble = num * factor;
System.out.println("Double: " + asDouble + "\tBigDecimal: " + asBigDecimal);
当我将factor 设置为以下各项时会发生这种情况:
factor = 1: Double: 4.35 BigDecimal: 4.3499999999999996447286321199499070644378662109375
factor = 10: Double: 43.5 BigDecimal: 43.4999999999999964472863211994990706443786621093750
factor = 100: Double: 434.99999999999994 BigDecimal: 434.9999999999999644728632119949907064437866210937500
factor = 1000: Double: 4350.0 BigDecimal: 4349.9999999999996447286321199499070644378662109375000
另外,当我将System.out.print(4.35 / 10); 作为一个单独的程序运行时,我会在控制台中得到0.43499999999999994。为什么在控制台中乘以 1、10 和 1000 会给出四舍五入的答案(作为双精度数)?我了解浮点精度的基础知识,并且 4.35 不应该能够以二进制形式精确表示,那么为什么 4.35 打印到控制台(asDouble)?为什么乘以 100 或除以 10 不自动四舍五入?
【问题讨论】:
-
就是这样。只需使用搜索功能,即可查看有关双打的大量其他问题。
-
研究
Double.toString()的文档,找出你的大部分原因。 -
如果您只关心输出格式,您可以使用
System.out.printf("%.3f", 0.1)打印精确到三个小数位的数字。
标签: java double bigdecimal floating-point-precision rounding-error