Java将小数位移至两倍
所以我将double设置为1234,我想将小数点后移至12.34
因此,我将.1乘以1234两次,就像这样
double x = 1234;for(int i=1;i<=2;i++)
{
x = x*.1;
}
System.out.println(x);
这将打印结果“ 12.340000000000002”
有没有一种方法,不用简单地将其格式化为两位小数,就可以正确地保存双重存储12.34?
回答:
如果使用double
或float
,则应使用舍入或期望看到一些舍入错误。如果你无法执行此操作,请使用BigDecimal
。
你遇到的问题是0.1不是精确的表示形式,并且通过执行两次计算,你正在使该错误复杂化。
但是,可以准确表示100,因此请尝试:
double x = 1234;x /= 100;
System.out.println(x);
打印:
12.34
之所以有效,是因为Double.toString(d)代表你进行了少量的四舍五入,但是操作并不多。如果你想知道四舍五入后的样子:
System.out.println(new BigDecimal(0.1));System.out.println(new BigDecimal(x));
印刷品:
0.10000000000000000555111512312578270211815834045410156212.339999999999999857891452847979962825775146484375
简而言之,无论你是否显式地进行浮点运算,明智的答案都不可避免地需要四舍五入。
注:x / 100
和x * 0.01
当它涉及到舍入误差是不完全一样的。这是因为第一个表达式的舍入误差取决于x
的值,而0.01
第二个表达式中的则具有固定的舍入误差。
for(int i=0;i<200;i++) { double d1 = (double) i / 100;
double d2 = i * 0.01;
if (d1 != d2)
System.out.println(d1 + " != "+d2);
}
版画
0.35 != 0.350000000000000030.41 != 0.41000000000000003
0.47 != 0.47000000000000003
0.57 != 0.5700000000000001
0.69 != 0.6900000000000001
0.7 != 0.7000000000000001
0.82 != 0.8200000000000001
0.83 != 0.8300000000000001
0.94 != 0.9400000000000001
0.95 != 0.9500000000000001
1.13 != 1.1300000000000001
1.14 != 1.1400000000000001
1.15 != 1.1500000000000001
1.38 != 1.3800000000000001
1.39 != 1.3900000000000001
1.4 != 1.4000000000000001
1.63 != 1.6300000000000001
1.64 != 1.6400000000000001
1.65 != 1.6500000000000001
1.66 != 1.6600000000000001
1.88 != 1.8800000000000001
1.89 != 1.8900000000000001
1.9 != 1.9000000000000001
1.91 != 1.9100000000000001
以上是 Java将小数位移至两倍 的全部内容, 来源链接: utcz.com/qa/425364.html