在Java中将字符串转换为浮点数而不四舍五入

7

可能是重复问题:
Java中的四舍五入 Float.parseFloat

我想把字符串转换成浮点数,我这么说:

System.out.println(Float.parseFloat("1553781.9829"));

输出:

1553782.0

我说:
System.out.println(Float.valueOf("1553781.9829"));

输出:

1553782.0

如何在不失精度的情况下获取浮点数?


请使用Double而不是Float - davidrac
1
请记住,浮点数值是近似值,而不是精确值。"1553781.9999999999"将变成1553782 - Salman A
4个回答

7

使用 System.out.println(Double.parseDouble("1553781.9829")); 代替。

float 类型有大小的限制 (4 字节),所以不适用于大数位小数,double 类型则拥有双倍的大小 (8 字节)。


5
如果你想要更高的精度,我建议使用 BigDecimal。它就像普通的包装类一样,提供了所有操作的方法。是的,它也可以接受字符串作为参数。
  BigDecimal bd = new BigDecimal("1553781.9829");
  System.out.println(" bd :"+ bd);  //prints the same value

URL: http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html 这是一个涉及IT技术的网页链接,介绍了Java中的BigDecimal类。使用BigDecimal可以精确地计算和处理数字,可以避免使用传统的double或float类型时出现的误差问题。请点击上述链接了解更多详情。

如果我使用BigDecimal,我需要将其转换为float类型才能像float类型一样使用它吗?我的意思是,我已经有了使用float类型的类,我要重新制作它以使用BigDecimal吗? - Kliver Max
1
您也可以使用BigDecimal进行所有浮点数运算。因此,建议将float替换为BigDecimal。 - rai.skumar

2

在没有精度损失的情况下,您不能使用float或double。首先,它们的精度是有限的,对于float大约为7-8个十进制数字,对于double约为16个数字。除此之外,Java浮点类型在内部是二进制的,因此它们无法存储一些小数而不会失去精度。如果您确实需要精确的小数,请使用java.math.BigDecimal。阅读“Effective Java”第48项:“如果需要精确答案,请避免使用float和double”。


如果我使用BigDecimal,需要将其转换为float类型,以便像float类型一样使用吗?我的意思是,我已经有了可以使用float类型的类,我要重新制作它以使用BigDecimal吗? - Kliver Max
如果需要的话,您可以将其转换为float或double,如bd.floatValue()或db.doubleValue()。但是,您也可以将其作为BigDecimal处理,它具有所有必要的算术运算。 - Evgeniy Dorofeev
但是如果我将bd转换为浮点数,会失去精度吗? - Kliver Max
是的,我会尝试将数据库转换为浮点数并四舍五入。但还是谢谢你的回答) - Kliver Max
当然,这完全取决于情况。浮点数短小快速,但您需要意识到即使使用双精度浮点数也无法保证精度。请参阅我的“Effective Java”更新。 - Evgeniy Dorofeev

0

你可以使用 Double 代替 Float

System.out.println(Double.valueOf("1553781.9829"));
System.out.println(Double.parseDouble("1553781.9829"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接