当前位置: 首页 > 面试题库 >

Java将小数位移至两倍

松兴邦
2023-03-14
问题内容

所以我将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?


问题答案:

如果使用doublefloat,则应使用舍入或期望看到一些舍入错误。如果你无法执行此操作,请使用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.100000000000000005551115123125782702118158340454101562
12.339999999999999857891452847979962825775146484375

简而言之,无论你是否显式地进行浮点运算,明智的答案都不可避免地需要四舍五入。

注:x / 100x * 0.01当它涉及到舍入误差是不完全一样的。这是因为第一个html" target="_blank">表达式的舍入误差取决于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.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


 类似资料:
  • 问题内容: 如何在不使用的情况下将小数点后两位取整到5位? 问题答案: 通过乘以数字,可以将其舍入到小数点后第五位。然后进行正常的舍入,并再次使其达到小数点后第五位。 假设要舍入的值是一个named : 如果要舍入到小数点后6位,请设为,依此类推。

  • 本文向大家介绍java、freemarker保留两位小数,包括了java、freemarker保留两位小数的使用技巧和注意事项,需要的朋友参考一下  一、Java保留2位小数 二、freemarker保留两位小数 补充:freemarker保留小数 freemarker保留两位小数 方法一     #{number ;m1M2}    m 最少几位小数,M最多几位小数 方法二   ${x?stri

  • 问题内容: 所以我想做的是将double转换为有理数。我检查小数点后有多少个数字,例如,我想将数字123.456保存为123456/1000。 但是,对于数字123.456,我得到了一个四舍五入的错误,结果是123455。我想可以用BigDecimal来解决这个问题,但我无法使其正常工作。同样,在计算出有理数之后,我想用参数(int numerator,int denominator)调用另一个构

  • 将双精度数字相乘,从输出中取小数点后两位 expectedRenewalAmount的输出是,那么我们如何用两个十进制数格式化上述输出 预期:

  • 我有值,我希望它们至少有两个十进制数字,但我不想修剪其余的数字。 是否有构建方法或更优雅的方法来实现这一点? 我不能使用,因为我希望在存在其他小数时保留它们。

  • 问题内容: 有人知道我如何将双精度值四舍五入为3个有效数字,例如本网站上的示例 http://www.purplemath.com/modules/rounding2.htm 问题答案: