java – 十六进制 – >浮点转换不准确
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 十六进制 – >浮点转换不准确,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1831字,纯文字阅读大概需要3分钟。
内容图文
![java – 十六进制 – >浮点转换不准确](/upload/InfoBanner/zyjiaocheng/825/82c20091a79149488ac1d6424053e7ad.jpg)
我正在使用以下代码将十六进制字符串转换为浮点字符串:
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出错了,我该如何纠正呢?
解决方法:
您可以通过直接将浮点值传递给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();
}
内容总结
以上是互联网集市为您收集整理的java – 十六进制 – >浮点转换不准确全部内容,希望文章能够帮你解决java – 十六进制 – >浮点转换不准确所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。