[英]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.