繁体   English   中英

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

[英]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");
    }
}

但是,第二个断言失败。 根据像各种在线转换器这一项50000000应该被转换成8589934592但Java返回8589934600

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

现在哪个结果正确? 如果Java错误,那么我该如何纠正?

您可以通过将float值直接传递给BigDecimal构造函数来实现(如下所示)。问题的原因是Float.toString(value) (由于此方法是对FloatingDecimaltoJavaFormatString内部调用, toJavaFormatString似乎对值进行了四舍五入),因此无需使用Float.toString相反,只需传递您的实际float值即可。

    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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM