C++ 当双精度减去整数时,会发生精确丢失

C++ 当双精度减去整数时,会发生精确丢失,c++,C++,到 以下计算结果将是正确的。所以这两个“0.525”看起来实际上不同 有人知道到底发生了什么吗 我知道IEEE 754,但如果是这样的话,为什么计算结果是一样的,都是“0.525”而不是“0.5249999999” 提前谢谢 仅仅因为std::cout打印相同的内容,并不意味着它的值完全相同。尝试使用不同的值。你会感到惊讶的 不同的精度将导致std::cout对其输出的值进行不同的四舍五入 你应该做的不是直接比较,而是比较你的结果和期望值之间的距离。比如: float_part =

以下计算结果将是正确的。所以这两个“0.525”看起来实际上不同

有人知道到底发生了什么吗

我知道IEEE 754,但如果是这样的话,为什么计算结果是一样的,都是“0.525”而不是“0.5249999999”


提前谢谢

仅仅因为
std::cout
打印相同的内容,并不意味着它的值完全相同。尝试使用不同的值。你会感到惊讶的

不同的精度将导致
std::cout
对其输出的值进行不同的四舍五入

你应该做的不是直接比较,而是比较你的结果和期望值之间的距离。比如:

       float_part = 0.525; 
常数双ε=1e-6;
//...

哇!我刚刚测试过你是对的。我不知道cout会以这种奇怪的方式对值进行取整。似乎,只要计算涉及浮点或双精度,结果就不能保证是预期的结果@彭浩翔 -- “结果不一定是预期的”:这取决于你的预期。当涉及到浮点数学时,大多数人的直觉使他们失望。实数的精度是无限的,大多数人最初期望浮点数的行为和它们一样。但浮点数的精度有限,不能像实数那样工作。但是考虑:
inti=1;i/=3;i*=3
浮动f=3;f/=3;f*=3。第一个生成0没有问题,但是很多人都很惊讶第二个没有生成1。似乎当计算多次涉及浮动时,结果会逐渐失去控制,我的意思是,即使是0.2*2也会生成0.7999999@彭浩翔 你应该读书。这很难做到全面,但这是揭开浮点运算神秘面纱的一个良好开端。
       float_part = abs(double_n) - (int)abs((double_n)); 
       float_part = 0.525; 
const double epsilon = 1e-6;
//...
cout << abs(float_part - 0.525) < epsilon << '\n';