我写了一个程序,结果让我感到奇怪
我有一个带有3位小数的double
数字,但我需要将其更改为2位小数
首先我将它乘以100,然后我将其改为int
,然后我将其除以100,但我不知道为什么
结果是错误的
输入:9.857
输出为:9.8499999999999996
这是我的代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
double sum = 9.857, temp = 0;
temp = int(sum * 100);
temp = int(temp);
sum = temp / 100;
printf("%.16f\n", sum);
}
输入:9.857
输出为:9.850000000000000
第二段代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
double sum = 9.857, temp = 0;
temp = int(sum * 100);
temp = int(temp);
sum = temp / 100;
printf("%.15f\n", sum);
}
为什么这两个代码段的答案不同?
答案 0 :(得分:4)
除了浮点运算之外,您还使用了不安全的printf系列函数,尽管包括<iostream>
。在C ++中限制输出值精度的正确方法是设置ostream的精度值:
#include <iostream>
int main()
{
double sum = 9.857, temp = 0;
std::cout.precision(4);
std::cout << "Value = " << sum << std::endl;
std::cout.precision(3);
std::cout << "Value = " << sum << std::endl;
std::cout.precision(2);
std::cout << "Value = " << sum << std::endl;
return 0;
}
如果您想在C中执行此操作,它将如下所示:
#include <stdio.h>
int main()
{
double sum = 9.857, temp = 0;
printf("Value = %.3f\n", sum);
printf("Value = %.2f\n", sum);
return 0;
}
如果您正在寻找精确值,浮点类型由于存储方式而不是正确的类型(它们不准确)。这意味着在许多情况下,尝试显示小数点后的15位数字可能不会给出与输入相同的结果。