为什么当我在代码下面运行时会跟踪这么多数字?
BigDecimal lat = new BigDecimal(0.0077);
System.out.println(lat);
输出>> 0.00770000000000000024702462297909733024425804615020751953125
我想准确打印我输入的内容。我怎么能这样做?
答案 0 :(得分:7)
大多数有限小数部分不能用浮点精确表示,因此这是您在创建浮点文字0.0077
时得到的近似值。
要避免此问题,请改用构造函数BigDecimal(String val)
:
BigDecimal lat = new BigDecimal("0.0077");
正如@TimB指出的那样,如果你已经有double
值,你也可以使用:
BigDecimal lat = BigDecimal.valueOf(doubleVal);
此外,这里是对What Every Computer Scientist Should Know About Floating-Point Arithmetic的强制性引用。
答案 1 :(得分:3)
当你有一个像0.077
这样的数字时,这个数字无法准确表示,实际上你会得到一个几乎是这个的数字,但误差很小。当您将此数字打印为字符串时,执行此操作的代码“知道”以丢弃小错误,并且您会看到您期望的数字。
BigDecimal试图给你一个忠实的代表,即使这是令人惊讶的,它也在做它应该做的事情。您想要使用的是以下方法
BigDecimal bd = BigDecimal.valueOf(0.077);
在这种情况下,BigDecimal采用打印时的值,而不是表示的真值。
为什么这么久?
要准确表示53位分数(double有53位尾数),您需要53个十进制数字。例如每次你乘以10得到另一个数字时,你得到多个2(和5),这使得低位0,最终你保证拥有所有0位而不是更多位数。
答案 2 :(得分:1)
试试这个:
System.out.println(String.format("%.4f",lat));
其中4
in %.4f
指定了您要显示的小数位数
请注意,这只会格式化您的输出显示。然而,lat的实际值仍为0.00770000000000000024702462297909733024425804615020751953125
答案 3 :(得分:0)
您还可以使用NumberFormat并指定小数位数setMinimumFractionDigits(4)
BigDecimal lat = new BigDecimal(0.0077);
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMinimumFractionDigits(4);
System.out.println(nf.format(lat));
答案 4 :(得分:-1)
BigDecimal lat = new BigDecimal(0.0077);
lat=lat.setScale(4,RoundingMode.HALF_EVEN);
System.out.println(lat);