在Java中从float到BigDecimal的操作

时间:2014-04-12 10:40:13

标签: android floating-point bigdecimal

我在数小时内进行数学运算,但我遇到浮点问题(java虚拟机近似并不完美)。所以,我决定在BigDecimal中转换这个操作......但是我遇到了一些结果问题..

这是原始代码:

public float ConvertTo100(float input)
    {
float output = 0.0f;
        int hh;
        float mm;
        hh = (int)input;
        mm = input - hh;

        output = hh + ((input - hh)/60) * 100;

        return output;
}

这是我的转换,但不起作用:

    public float ConvertTo100(float input)
        {
            BigDecimal inputBD = new BigDecimal(Float.toString(input));

            String inpString = String.valueOf(input);
            String[] inpsplit = inpString.split("\\.");

            BigDecimal hh = new BigDecimal(Float.toString(Integer.parseInt(inpsplit[0])));

            BigDecimal output = hh.add((inputBD.subtract(hh).divide(BigDecimal.valueOf(60))).multiply(BigDecimal.valueOf(1000)));

            return Float.parseFloat(String.valueOf(output));
}

问题出在哪里?非常感谢!!! :)

1 个答案:

答案 0 :(得分:0)

对于许多输入,除以60的除法不能精确地以十进制表示。要继续使用BigDecimal,您需要为分部选择缩放和舍入模式。这是一种方法,但请阅读BigDecimal documentation以查看所有选项。

BigDecimal output = hh.add((inputBD.subtract(hh).divide(
    BigDecimal.valueOf(60), 10, BigDecimal.ROUND_HALF_EVEN))
    .multiply(BigDecimal.valueOf(1000)));

然而,使用BigDecimal的要点是获得小数分数的精确表示。你没有获得这样的好处,但是得到了使用方法调用而不是中缀运算符进行算术运算所产生的混乱代码。除非您需要特定的舍入模式,或者某些有限精度大于16.9位有效数字,否则使用double会更好。