代码之家  ›  专栏  ›  技术社区  ›  Shane

java Float.parseFloat中的舍入

  •  7
  • Shane  · 技术社区  · 14 年前

    System.out.println("float = "+Float.parseFloat("32000.0001"));
    

    我能做些什么来防止/控制倒圆吗?我希望返回不带舍入的完整值。

    6 回复  |  直到 14 年前
        1
  •  11
  •   Jim Garrison    14 年前

    浮点数只有24位精度,这不足以容纳数值中的位数。舍入不是由于解析,而是由于数字的大小。如果需要浮点,则必须使用double;如果需要任意精度,则必须使用BigDecimal。

        2
  •  2
  •   Romain Hippeau    14 年前


    某些十进制数没有精确的基2表示法是需要记住的一件事。 例如0.1、0.01、0.001。所以要用基数2来表示这些数字,需要四舍五入。

    另一个问题是,您正在处理一组有限的位来表示数字,并且可能会遇到其他舍入错误。而且,离0越远,就有越多的数字无法精确表示,因此进行舍入。

    正式论文见: http://www.scribd.com/doc/5836/What-Every-Computer-Scientist-Should-Know-About-FloatingPoint-Arithmetic

    不要在需要知道确切数字的地方使用浮点数。

        3
  •  1
  •   Jon Skeet    14 年前

    强烈地 建议使用 BigDecimal 相反。

    事实上,我并不完全清楚(没有检查)问题是否是 从字符串或 格式化 回到弦上。

    float 只有7(保证)个有效数字,而您正试图保留9。

        4
  •  1
  •   trashgod    14 年前

    正如其他人所说, float BigDecimal(double) 构造函数是精确的,因此它是查看表示的一种简便方法:

    System.out.println(new BigDecimal(32000.0001f)); // as float
    System.out.println(new BigDecimal(32000.0001d)); // as double
    

    其中显示:

    32000
    32000.00010000000111176632344722747802734375
    
        5
  •  0
  •   Aaron Digulla    14 年前

    BigDecimal . 原始类型 float double 速度更快,但不能表示许多常见的十进制值。

        6
  •  0
  •   Edwin Buck    14 年前

    浮动和双倍是有限的。它们只能将数字的小数部分精确地表示为两个小数的和。分数部分可以完全表示为某些级数的和,如:

    1/2 + 0/4 + 1/8 + 1/16 + ...

    不幸的是,有大量常用的数字永远无法完全表示,如:

    1/3、1/7、1/9、5/11等。

    有一些二进制十进制库可以精确地执行这些计算。他们的计算速度往往较慢,因为没有专门的硬件来加速他们的计算。而且,它们往往会占用更多的内存,因为您实际上是在存储一个数字列表。