可能重复:
为什么Visual Studio 2008告诉我.9 - .8999999999999995 = 0.00000000000000055511151231257827?
为什么简单的双打如1.82最终成为1.819999999645634565360?
在编译并运行以下程序时,我得到了一个非常奇怪的行为:
#include <iostream>
#define DIV 10000ll
long long gcd(long long a, long long b) {
if(b==0) return a;
else return gcd(b, a % b);
}
int main() {
int t;
std::cin >> t;
while(t--) {
double n1;
std::cin >> n1;
long long inum=(long long)(n1*DIV);
std::cout << inum << std::endl;
if(inum==0) { std::cout << 1 << std::endl; }
else std::cout << DIV/gcd(inum,DIV) << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我输入输入时:
1
0.0006
Run Code Online (Sandbox Code Playgroud)
我得到了输出
5
2000
Run Code Online (Sandbox Code Playgroud)
这意味着:(long long)0.0006*10000等于5而不是6.为什么会发生这种情况?
0.0006不能完全表示为double.最有可能存储的实际结果类似于0.00059999999 ...当此值乘以10000时,它会给出一个略小于6的数字.将其转换为整数类型会将其截断(向下舍入)为5.
这不是奇怪的行为.这就是浮点运算的工作原理.如果你想得到值6,你应该舍入到最接近的整数而不是截断.
有关
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |