在双数据类型的情况下,对于一些munbers,小数点精度会丢失

时间:2016-09-23 08:20:06

标签: java double

我很惊讶看到下面的程序请告知它是如何表现的,因为我非常想念小数点之后的精确度,下面是progrmam

double fixedRate = 0.997500000000;  //**output --->0.9975
    //  BigDecimal fixedRate = new BigDecimal("0.997500000000");        
        double fixedRate1 = 0.1234567890123456789;  

        System.out.println(fixedRate);
        System.out.println(fixedRate1);

,输出

0.9975
0.12345678901234568

现在请建议第一个输出是0.9975,但是接下来它不会截断小数点之后但是为什么第一个呢。

3 个答案:

答案 0 :(得分:0)

This is a printing problem.Please use this format to print your values and tell me the result: 

double fixedRate = 0.997500000000;
double fixedRate1 = 0.1234567890123456789; 

System.out.println(String.format("%.19f", fixedRate ));
System.out.println(String.format("%.19f", fixedRate1 ));

Good Luck !

答案 1 :(得分:0)

精度不会丢失。它只是不打印,因为您不需要更多数字来区分打印值和任何其他双值。

如果您确实要强制使用一定数量的小数位数,请查看 System.out.printf() String.format()

有关详细信息和可能的格式,请参阅https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html

结果可能如下所示:

            System.out.printf("%.19f%n",fixedRate);
            System.out.printf("%.19f%n", fixedRate1);

答案 2 :(得分:0)

根据你的问题

  

首先输出的输出是0.9975,但是接下来的输出是0.9975   在小数点之后截断,但为什么首先是

由于double是数值数据类型,因此无法保存前导零和尾随零。

double并不关心格式化 - 它仅关于存储。当您打印它时,它将转换为字符串(使用Double的静态toString方法)。

简单来说,值0.99750.997500000000没有差异,或者与0.997500000000相同,因为数字后没有任何值,所以为零。

但是考虑一下你是否有这样的价值0.9975000000001,那么所有的数字都会打印出来。检查here

如果您想格式化值,则可以看到以下问题:How to properly display a price up to two decimals (cents) including trailing zeros in Java?