浮点模数混乱

x0v*_*x0v 1 c++ java 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

rge*_*man 7

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

在Java程序中我得到的3.2999997也,但是当我改变doubles,并输出你的C++程序的输出相匹配:8.881784197001252E-16(演示).

无论哪种方式,你都离开了真正的数学价值,0因为两种语言中的浮点数都可能是不准确的.该float值必须是一个小更不准确的,因为他们更不精确的,因此不同的值,比3.3少一点.