【问题标题】:Android DecimalFormat rounding error: Random decimals addedAndroid DecimalFormat 舍入错误:添加了随机小数
【发布时间】:2015-10-14 07:16:21
【问题描述】:

我正在尝试格式化数字。它可以有 2 到 6 位小数。

如果我传递一个没有小数的数字,结果是可以的。 否则它会添加随机小数。

    float value = ...;

    DecimalFormat formatter_currency = new DecimalFormat();
    DecimalFormatSymbols nf = new DecimalFormatSymbols();  

    nf.setDecimalSeparator('.');
    nf.setGroupingSeparator(',');

    formatter_currency.setDecimalFormatSymbols(nf);
    formatter_currency.setMaximumFractionDigits(8);
    formatter_currency.setMinimumFractionDigits(2);

    return formatter_currency.format(value);

例如: 值 = 35 -> 35.00

值 = 35.6 -> 35.65932558(预期 35.60)

值 = 35.659 -> 35.68899918(预期为 35.659)

我读过这可能是浮点变量的问题。 我尝试了双精度,但结果是一样的。

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 能否在代码示例中提供您的导入?

标签: android format number-formatting


【解决方案1】:

我编写了这个快速测试程序,它似乎通过了你所有的测试用例:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

public class FormatTest { 
    public static void main(String[] args) { 
        double value = 35.659;

        DecimalFormat formatter_currency = new DecimalFormat();
        DecimalFormatSymbols nf = new DecimalFormatSymbols();  

        nf.setDecimalSeparator('.');
        nf.setGroupingSeparator(',');

        formatter_currency.setDecimalFormatSymbols(nf);
        formatter_currency.setMaximumFractionDigits(8);
        formatter_currency.setMinimumFractionDigits(2);

        System.out.println(formatter_currency.format(value));
    }
}

请尝试在您的机器上编译它并尝试输入不同的值。我基本上只是用double 而不是float 尝试过。如果您看到与上面发布的代码相同的结果,请告诉我。

【讨论】:

  • floats 的表示方式与 doubles 相同,只是存储空间减少了一半,并且伴随着明显的精度损失。
  • @Holmes 我明白这一点,我只是说在切换浮点数和双精度数时我无法重现该问题,这与问题中的 OP 所述相矛盾。
  • 更好但仍然不准确。我试过 35.63,输出是 35.63000107
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
相关资源
最近更新 更多