【问题标题】:Java. How to disable rounding in DecimalFormat爪哇。如何在 DecimalFormat 中禁用舍入
【发布时间】:2011-02-07 10:12:03
【问题描述】:

我可以在 DecimalFormat 中禁用舍入“功能”吗?

例如:

DecimalFormat f = new DecimalFormat();

f.parseObject("123456789012345.99");

结果是 1.2345678901234598E14

java版本“1.6.0_21”

【问题讨论】:

  • 结果是NOT string,结果是double,它的内部表示与你看到的字符串完全不同。

标签: java rounding decimalformat


【解决方案1】:

这与 Java 的特性无关。这是由于 IEEE 64 位双浮点数的精度有限。事实上,所有数据类型的精度都有限制。有些比其他的大。

double d = 123456789012345.99;
System.out.println(d);

打印

1.2345678901234598E14

如果您想要更精确,请使用 BigDecimal。

BigDecimal bd = new BigDecimal("123456789012345.99");
System.out.println(bd);

打印

123456789012345.99

即使 BigDecimal 也有限制,但它们远远超出了您或其他任何人的需要。 (约 20 亿位)

编辑:最大的已知素数适合 BigDecimal http://primes.utm.edu/largest.html

【讨论】:

  • 并且,您可以使用 DecimalFormat 使用 f.setParseBigDecimal(true) 解析 BigDecimal。
  • 你想做什么new BigDecimal(String)不做?
  • 我只是指出 DecimalFormat 也可以解析为 BigDecimal。并且,有许多新的 BigDecimal 无法处理的格式(例如数字中的逗号)。
【解决方案2】:

不,这不是四舍五入,这只是浮点数的工作方式。

做你想做的事的唯一方法是使用 BigDecimal。

我建议您阅读“每个计算机科学家都应该了解的关于浮点运算的知识”。

【讨论】:

    【解决方案3】:

    据我了解,您想以特殊格式打印数字。你需要打电话 applyPattern(String Pattern) 在这里:

      f.applyPattern(".000");
      System.out.println(f.format(123456789.99)); // prints 123456789.990
    

    音符模式是本地化的,例如在德国它将打印,而不是 .分离分数。 您可以通过

    设置舍入首选项
    f.setRoundingMode()
    

    猜猜我是从哪里学到这一切的?当然来自Java docs。阅读有关模式表达式的更多信息,以按照您喜欢的方式进行格式化

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多