java - 十六进制 -> float 转换不准确

标签 java string floating-point bigdecimal data-conversion

我正在使用以下代码将十六进制 String 转换为 float 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 one , 50000000 应转换为 8589934592 但 Java 返回 8589934600

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

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

最佳答案

您可以通过直接将 float 值传递给 BigDecimal 构造函数来实现此目的,如下所示。问题的原因是 Float.toString(value)( 因为此方法是对 FloatingDecimal 进行内部调用code> 和 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();
}

关于java - 十六进制 -> float 转换不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39465926/

相关文章:

java - 将任意对象注入(inject) Spring bean

c++ - 在字符串中查找所有需要的单词

c++ - 用于缓存昂贵计算的浮点相等

java - 如何访问android注解sharedPreference?

java - 我如何解密和加密 Java 程序的 Joomla 用户密码?

java - DirectBuffer 加速 ImageIO

来自 Int 的 C# Char 用作 String - VB Chr() 的真正等价物

c++ - 比较 C++ char* 字符以解析 .OBJ 文件

c - C 问题中的 pow() 函数

c - sleep() 以 float 作为参数不起作用