有什么方法可以在双变量中存储多达6个小数位? 例如,考虑一个双变量,其值为1.0,但我希望存储的值为1.000000
更新 实际上我接受了mettl的评估测试。我被要求编写一个程序来计算平均值,中位数和模式。结果应存储在double类型的输出变量S中,即output1,output2和output3。我还被要求用性别小数位存储它。因为我不能使用print语句,所以DecimalFormat是没用的。
答案 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