我正在使用以下代码将十六进制 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/