浮点模数混乱

时间:2014-06-11 16:51:09

标签: java c++ floating-point

我非常了解C ++,但我是java的初学者。

以下是两个经过测试的程序:

Java程序提供输出 3.2999997

import java.util.*;
import java.lang.*;
import java.io.*;

class Test
{
    public static void main(String args[])
    {
       float f = 9.9f, m = 3.3f;
       float c = f % m;
       System.out.println(c);
    }
}

C ++程序提供输出 8.88178e-16

#include <iostream>
#include<math.h>
int main()
{
   float f = 9.9f, m = 3.3f; 
   std::cout << fmod (9.9,3.3);
   return 0;
}

我对C ++程序的输出感到满意,但为什么Java没有给出零响应?

这怎么可能,因为 3.3 * 3 = 9.9

我知道Java认为float的精度为6-7位十进制数字,但我不知道这个输出是怎么来的?我在网上研究了这个问题,但没有找到这背后的逻辑。

1 个答案:

答案 0 :(得分:7)

Java程序正在使用float。但是C ++程序声明float并使用我假设的double浮点文字。

在你的Java程序中我也得到3.2999997,但是当我改为double时,输出与你的C ++程序的输出相匹配:8.881784197001252E-16demo)。< / p>

无论哪种方式,你都离开0的真正数学值,因为两种语言中的浮点数都不准确。 float值必须更加不准确,因为它们更不精确,因此值不同,略小于3.3。