将小数位数移动到双倍 [英] Moving decimal places over in a double

查看:121
本文介绍了将小数位数移动到双倍的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有一个双重设置等于1234,我想移动一个小数位以使它成为12.34

So I have a double set to equal 1234, I want to move a decimal place over to make it 12.34

所以要做到这一点我乘以.1到1234两次,有点像这样

So to do this I multiply .1 to 1234 two times, kinda like this

double x = 1234;
for(int i=1;i<=2;i++)
{
  x = x*.1;
}
System.out.println(x);

这将打印结果12.340000000000002

This will print the result, "12.340000000000002"

有没有一种方法,没有简单地将它格式化为两位小数位,可以正确地双重存储12.34?

Is there a way, without simply formatting it to two decimal places, to have the double store 12.34 correctly?

推荐答案

如果您使用 double float ,则应该使用舍入或期望看到一些舍入错误。如果您不能这样做,请使用 BigDecimal

If you use double or float, you should use rounding or expect to see some rounding errors. If you can't do this, use BigDecimal.

您所遇到的问题是0.1不完全表示,并通过执行计算两次,您将复制该错误。

The problem you have is that 0.1 is not an exact representation, and by performing the calculation twice, you are compounding that error.

但是,可以准确地表示100,因此请尝试:

However, 100 can be represented accurately, so try:

double x = 1234;
x /= 100;
System.out.println(x);

其中打印:

12.34

这是因为 Double.toString(d )代表你执行少量的舍入,但并不多。如果你想知道没有四舍五入可能是什么样子:

This works because Double.toString(d) performs a small amount of rounding on your behalf, but it is not much. If you are wondering what it might look like without rounding:

System.out.println(new BigDecimal(0.1));
System.out.println(new BigDecimal(x));

打印:

0.100000000000000005551115123125782702118158340454101562
12.339999999999999857891452847979962825775146484375

总之,四舍五入对于明智的答案是不可避免的浮点不管你是否明确地这样做。

In short, rounding is unavoidable for sensible answers in floating point whether you are doing this explicitly or not.

注意: x / code>和 x * 0.01 在舍入错误时并不完全相同。这是因为第一个表达式的循环错误取决于x的值,而第二个表达式的 0.01 有一个固定的循环错误。

Note: x / 100 and x * 0.01 are not exactly the same when it comes to rounding error. This is because the round error for the first expression depends on the values of x, whereas the 0.01 in the second has a fixed round error.

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.35000000000000003
0.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

这篇关于将小数位数移动到双倍的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆