删除尾随数字

时间:2014-02-10 09:16:45

标签: java bigdecimal

为什么当我在代码下面运行时会跟踪这么多数字?

BigDecimal lat =  new BigDecimal(0.0077);

System.out.println(lat);
  

输出>>   0.00770000000000000024702462297909733024425804615020751953125

我想准确打印我输入的内容。我怎么能这样做?

5 个答案:

答案 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);