我使用以下代码将十六进制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");
}
}
然而,第二个断言失败了。根据{{3}}等各种在线转换器,50000000
应转换为8589934592
,但Java返回8589934600
。
org.junit.ComparisonFailure:
Expected :8589934600
Actual :8589934592
现在哪个结果是正确的?如果Java出错了,我该如何纠正呢?
答案 0 :(得分:5)
你可以通过直接将浮点值传递给BigDecimal构造函数来实现这一点。如下问题。因为问题是Float.toString(value)
(因为这个方法是对FloatingDecimal
和toJavaFormatString
进行内部调用对值进行一些舍入)所以不需要使用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();
}