有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的浮点转换浮点值解析

当我这么做的时候

value = Float.parseFloat("5555998.558f");

System.out.println("Value: " + value);

它给我的结果是5555998.5,而不是5555998.558 我正在使用变量值进行一些计算。我需要精确的值,即5555998.558

如何克服这个问题


共 (4) 个答案

  1. # 1 楼答案

    这个高值的float值的精度只有0.5,所以Java将其解析为最接近的float值,它可以=5555998.5,这就是打印的结果

    要查看该量级上两个最接近的值之间的差异,请使用^{}(最后一位的单位):

    String s = "5555998.558f";
    float value = Float.parseFloat(s);
    System.out.println(value);
    System.out.println(Math.ulp(value));
    

    这张照片

    5555998.5
    0.5
    

    您可以使用double来获得更好的精度:

    double d = Double.parseDouble(s);
    System.out.println(d);
    System.out.println(Math.ulp(d));
    

    这张照片

    5555998.558
    9.313225746154785E-10
    

    有趣的是,Double.parseDouble似乎并不介意结尾的f^{}String转换为double“由类Double的valueOf方法执行”。和^{}国家:

    FloatValue:

    • Signopt NaN

    • Signopt Infinity

    • Signopt FloatingPointLiteral

    • Signopt HexFloatingPointLiteral

    • SignedInteger

    这个方法将把String当作一个Java数值文本,Java支持它,并在末尾用f表示浮点文本

  2. # 2 楼答案

    你也可以这样做:

    Double value = Double.valueOf("5555998.558f");
    System.out.println("Value: " + value);
    

    输出:

    Value: 5555998.558
    
  3. # 3 楼答案

    BigDecimal可能是精确十进制表示的最佳选择

    BigDecimal value = new BigDecimal("5555998.558");
    

    它是不可变的,所以你对它所做的每一个操作都会导致你创建一个新的BigDecimal实例,但它的精度也可能是你所需要的

  4. # 4 楼答案

    http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 浮点:浮点数据类型是单精度32位IEEE 754浮点。它的值范围超出了本文讨论的范围,但在Java语言规范的浮点类型、格式和值部分中有详细说明。与字节和短字符的建议一样,如果需要在大量浮点数数组中节省内存,请使用浮点(而不是双精度)。此数据类型不应用于精确的值,例如货币。为此,您需要使用java。数学改为使用BigDecimal类。数字和字符串包括BigDecimal和Java平台提供的其他有用类

    所以使用BigDecimal,你就不会有问题了