在JAVA变量中存储小数精度

时间:2014-08-14 17:39:35

标签: java precision decimalformat

有什么方法可以在双变量中存储多达6个小数位? 例如,考虑一个双变量,其值为1.0,但我希望存储的值为1.000000

更新 实际上我接受了mettl的评估测试。我被要求编写一个程序来计算平均值,中位数和模式。结果应存储在double类型的输出变量S中,即output1,output2和output3。我还被要求用性别小数位存储它。因为我不能使用print语句,所以DecimalFormat是没用的。

5 个答案:

答案 0 :(得分:6)

你误解了双打的本质。 1.0和1.000000之间没有区别。它们都是相同的数字。

" 1.0"之间的区别和" 1.000000":

String.format("%.1f", 1.0) //returns "1.0"

String.format("%.6f", 1.0) //returns "1.000000"

其他信息:

有些人告诉你使用BigDecimal而不是double。这可能是你问题的答案,但这取决于你的问题究竟是什么。你说,你想要存储" 6位精度"。 double可以存储大约16位精度,但是"精度数字"与小数点后的数字不同。

想要完成什么

答案 1 :(得分:2)

对于受限制的值范围,常规double在句点后具有所需的6位数精度。

您是否准备精确到6位精度? (而不是更多)你可能想看一下定点算术(有图书馆)。对于任意大的值,您是否希望点后至少有6位数? BigDecimal可以做到这一点。

您是否希望将1.0表示为1.000000?这是一个显示,而不是数学问题。使用字符串或者更确切地说,将数字保存在上述表示之一中并相应地格式化。

答案 2 :(得分:1)

我通常不会推荐BigDecimal,但它似乎就是你想要的。特别是你想要一个 scale 为6的BigDecimal。如果你还设置了一个精度为6的MathContext,这是最简单的。我认为你需要在每一步手动设置比例。

    BigDecimal bd1 = new BigDecimal("1.0",mc).setScale(6); // preferred constructor using a string 
    BigDecimal bd2 = new BigDecimal(3.0,mc).setScale(6);   // will work in this case as scale is set 
    BigDecimal bd3 = bd1.divide(bd2,mc).setScale(6);       // need to specify the context and scale for each operation
    BigDecimal bd4 = bd1.multiply(bd2,mc).setScale(6);     // need to specify the context for each operation
    System.out.println(bd1);
    System.out.println(bd2);
    System.out.println(bd3);
    System.out.println(bd4);

给予1.000000,3.000000,3.333333,3000000作为结果。

当然,到处都有6个小数位实际上会使得一些总和更糟糕

    BigDecimal bd5 = bd3.multiply(bd2,mc).setScale(6); 

你得到0.999999作为答案,这比你使用双打更糟糕。

答案 3 :(得分:0)

如果关于打印,你可以这样做:

PrintStream out = new PrintStream(System.out);

double x = 1.0;

out.printf("%,6f", 1.0);

这将打印1.000000

答案 4 :(得分:-1)

如果你想用double进行一些计算,就会导致精确失去。

为了保持准确,您应该使用BigDecimal

要了解您应阅读IEEE floating point

一些使用示例将是:

  

(1/3 + 1/12 + 1/8 + 1/30)=> 0.6083333333333333

以下是一些提示The need for BigDecimal

相关问题