【问题标题】:Storing decimal precision in a JAVA variable将十进制精度存储在 JAVA 变量中
【发布时间】:2014-08-14 17:39:35
【问题描述】:

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

更新: 实际上我参加了mettl的评估测试。我被要求编写一个程序来计算平均值、中位数和众数。结果应存储在 double 类型的输出变量 S 中,即 output1、output2 和 output3。我还被要求用性别小数位存储它。由于我不能使用打印语句,因此 DecimalFormat 没有用。

【问题讨论】:

  • 你是什么意思存储?在数据库中?在一个文件中?作为字符串/文本?作为一个数字?二进制?
  • 存储的意思是当我打印该变量时,它应该显示 1.000000 例如,考虑双变量 d 和 System.out.println(d);应该显示 1.000000
  • 可能在打印之前使用 DecimalFormat 或@james large 的答案。两者都应该工作。 BigDecimal 不再允许您执行正常操作,而是使用 BigDecimal 方法,例如 x.add(y)。如果您要使用它,请记住这一点

标签: java precision decimalformat


【解决方案1】:

您误解了双打的性质。 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 位精度,但“精度位”与小数点后的数字不同。

真正想要完成什么?

【讨论】:

  • 这些十进制格式只能打印小数吧?但我想让变量存储六位小数。这不可能吗?
  • 不可能使变量存储小于 大约 16 个有效数字。这就是double
  • 其实我参加了mettl的评估测试。我被要求编写一个程序来计算平均值、中位数和众数。结果应存储在双精度类型的输出变量中,即 output1、output2 和 output3。我也被要求像这样存储它。我不能使用打印语句。
【解决方案2】:

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

您是否希望精确到 6 位数? (而不是更多)您可能想查看定点算术(有它的库)。对于任意大的值,您是否希望点后至少有 6 位数字? BigDecimal 可以做到这一点。

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

【讨论】:

  • 是的,我希望将 1.0 表示为 1.000000。但我想通过变量来存储那么多小数。
  • @PraveenKumar 为什么? 1.0 和 1.000000 之间没有区别。
  • @Gumbo 是的,没有区别。但是我正在参加考试,问题是这样的。
【解决方案3】:

我通常不推荐 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、0.333333、3.000000 作为结果。

当然,如果你在任何地方都有 6 个小数位,实际上会让一些总和变得更糟

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

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

【讨论】:

    【解决方案4】:

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

    PrintStream out = new PrintStream(System.out);
    
    double x = 1.0;
    
    out.printf("%,6f", 1.0);
    

    这将打印1.000000

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多