十六进制 -> 浮点数转换不准确

Hexadecimal -> Float Conversion Inaccurate

我正在使用以下代码将十六进制 String 转换为浮点数 String:

private static String removeScientificNotation(float value)
{
    return new BigDecimal(Float.toString(value)).toPlainString();
}

/**
 * Converts a hexadecimal value to its single precision floating point representation
 *
 * @param hexadecimal The <code>hexadecimal</code> to convert
 * @return The converted value
 */
public static String hexadecimalToFloatingPoint(String hexadecimal)
{
    Long longBits = Long.parseLong(hexadecimal, 16);
    Float floatValue = Float.intBitsToFloat(longBits.intValue());

    return removeScientificNotation(floatValue);
}

为了测试这个,我写了下面的 JUnit 测试:

public class TestConversions
{
    @Test
    public void testConversions()
    {
        String floatValue = Conversions.hexadecimalToFloatingPoint("40000000");
        Assert.assertEquals(floatValue, "2.0");
        floatValue = Conversions.hexadecimalToFloatingPoint("50000000");
        Assert.assertEquals(floatValue, "8589934592");
        floatValue = Conversions.hexadecimalToFloatingPoint("C0000000");
        Assert.assertEquals(floatValue, "-2.0");
    }
}

但是,第二个断言失败了。根据各种在线转换器,如 this one50000000 应转换为 8589934592,但 Java returns 8589934600.

org.junit.ComparisonFailure: 
Expected :8589934600
Actual   :8589934592

现在哪个结果是正确的?如果 Java 有误,我该如何更正?

您可以通过直接将浮点值传递给 BigDecimal 构造函数来实现此目的,例如 below.Cause 问题是 Float.toString(value)( 因为此方法是对 FloatingDecimal 和 [=14= 进行内部调用] 它似乎对值做了一些舍入)所以不需要使用 Float.toString 而只是传递你的实际浮点值。

    String myString = "50000000";
    Long i = Long.parseLong(myString, 16);
    Float f = Float.intBitsToFloat(i.intValue());
    String finalString= new BigDecimal(f).toPlainString();
    System.out.println("final value  "+finalString);

所以只需像下面这样更改您的方法即可。

private static String removeScientificNotation(float value)
{
    return new BigDecimal(value).toPlainString();
}