【问题标题】:float and int value subtraction in JavaJava中的float和int值减法
【发布时间】:2013-02-04 18:31:16
【问题描述】:

我认为跟随在某种程度上与浮点值的精度有关,但我不确定如何以及为什么观察到完全跟随的行为。我在java中有以下代码:

class float_int
{
    void float_to_int(float val)
    {
        int int_val = (int)val;
        float remain_val = val - (float)int_val;
        System.out.println("val - " + val);
        System.out.println("int_val - " + (float)int_val);
        System.out.println("remain_val - " + remain_val);
    }

    public static void main(String args[])
    {
        float_int obj = new float_int();
        obj.float_to_int((float)12.345);
    }
}

我得到以下输出:

val - 12.345
int_val - 12.0
remain_val - 0.34500027

现在我不知道为什么我会在剩余值的末尾得到一个额外的“27”。

【问题讨论】:

  • 我建议使用double,除非您有非常好的理由。您仍然会看到这些问题,但它们会小约 10 亿倍。

标签: java type-conversion


【解决方案1】:

因为12.345 和0.345 都不能完全用二进制浮点表示。

For example:

float f = 12.345f;
System.out.printf("%.15f\n", f);  // Displays 12.345000267028809

在上述代码中,12.345000267028809 是 可精确表示的最接近的值。

【讨论】:

  • “27”的任何原因还是只是随机的?
  • @pkumar.. 只需尝试将0.345 转换为base 2,您就会知道。是时候拿出笔和纸了。不要随便相信任何陌生人。
  • @pkumar。一旦您成功转换为 base 2,就该通过 -floating-point SO 上的标记 wiki。
【解决方案2】:

你是对的,这是因为浮点数不精确。

如果你希望你的浮点数被正确表示,你可以使用这个人似乎采取的相同方法:http://floating-point-gui.de/languages/java/

这是对浮点数进行四舍五入:

String.format("%.2f", 1.2399) // returns "1.24"
String.format("%.3f", 1.2399) // returns "1.240"
String.format("%.2f", 1.2) // returns "1.20"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 2021-03-02
    • 2011-10-11
    • 1970-01-01
    • 2012-04-19
    • 2018-03-14
    • 2011-03-22
    • 2015-04-16
    相关资源
    最近更新 更多