繁体   English   中英

删除尾随数字

[英]Remove trailing numbers

当我在代码下面运行时,为什么我会得到这么多数字?

BigDecimal lat =  new BigDecimal(0.0077);

System.out.println(lat);

输出>> 0.00770000000000000024702462297909733024425804615020751953125

我想准确打印我输入的内容。 我怎样才能做到这一点?

大多数有限小数部分不能用浮点精确表示,因此这是您在创建浮点文字0.0077时得到的近似值。

要避免此问题,请使用构造函数BigDecimal(String val)

BigDecimal lat = new BigDecimal("0.0077");

正如@TimB指出的那样,如果你已经有一个double值,你也可以使用:

BigDecimal lat = BigDecimal.valueOf(doubleVal);

此外,这里是对每个计算机科学家应该知道的关于浮点运算的强制性参考。

当你有一个像0.077这样的数字时,这个数字无法准确表示,实际上你会得到一个几乎就是这个的数字,但误差很小。 当您将此数字打印为字符串时,执行此操作的代码“知道”以丢弃小错误,并且您会看到所需的数字。

BigDecimal试图给你一个忠实的代表,它正在做它应该做的事,即使这是令人惊讶的。 您要使用的是以下方法

BigDecimal bd = BigDecimal.valueOf(0.077);

在这种情况下,BigDecimal采用打印时的值,而不是表示的真值。

为什么这么久?

要准确表示53位分数(double有53位尾数),您需要53位十进制数字。 例如,每当你乘以10得到另一个数字时,你就会得到多个2(和5),这使得低位0,最终你保证拥有所有0位而不是更多位数。

尝试这个:

   System.out.println(String.format("%.4f",lat));

其中4 in %.4f指定了要显示的小数位数

请注意,这只会格式化您的输出显示。 然而,lat的实际值仍为0.00770000000000000024702462297909733024425804615020751953125

您也可以使用NumberFormat并指定小数位数setMinimumFractionDigits(4)

BigDecimal lat =  new BigDecimal(0.0077);
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMinimumFractionDigits(4);
System.out.println(nf.format(lat));
 BigDecimal lat =  new BigDecimal(0.0077);
 lat=lat.setScale(4,RoundingMode.HALF_EVEN);
 System.out.println(lat);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM