Android Java中从float到BigDecimal的操作

Android Java中从float到BigDecimal的操作,android,floating-point,bigdecimal,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; o

我花了两个小时在做一个数学运算,但我对浮点运算有一个问题(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));
}

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

对于许多输入,用60除不能精确地用十进制完成。要继续使用
BigDecimal
,您需要为除法选择刻度和舍入模式。这里有一种方法,但请阅读以查看所有选项

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

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

会更好。您似乎正在进行大量到
字符串的无意义转换。避免使用
BigDecimal(double)
构造函数的唯一原因是避免四舍五入到
double
。您已经有了一个
float
,并且所有
float
值都可以在
double
中精确表示,没有舍入。耶!!:)非常感谢!这对我来说太棒了!:)