我有一个看似简单的c ++问题困扰着我。代码的输出
#include <iostream>
using namespace std;
int main() {
// your code goes here
double c = 9.43827 * 0.105952 ;
cout << c << endl ;
return 0;
}
是1.只是1.我想这是由于基于c ++中存储双精度的精度损失,但肯定在c ++中必须有一种方法可以在结果中获得某种精度(2或3个小数位) 。
答案 0 :(得分:1)
存储不精确损失,转换为文本时精度损失。 double的流插入器默认为六位有效数字。此处的产品1.000003583,四舍五入为六位有效数字,为1.00000。此外,如果您还没有设置showpoint
,则会抑制尾随零和小数点,因此您将看到裸1.为了显示小数点,请使用{{ 1}}。要查看更多有效数字,请使用std::cout << std::showpoint << c << '\n';
,其中std::cout << std::setprecision(whatever) << c << '\n';
是您希望格式化程序使用的位数。
答案 1 :(得分:0)
#include <stdio.h>
int main() {
// your code goes here
double c = ((double)9.43827) * 0.105952 ;
for(int i = (sizeof(double)*8)-1; i >= 0; i-- ) {
printf("%ld", (*(long*)&c>>i)&1);
}
}
如果你运行它,你可以清楚地看到你的double的位表示不是整数值1.你没有丢失任何数据。
0011111111110000000000000000001111000001110100001010001001001001
但它非常接近1,所以这就是打印出来的。
答案 2 :(得分:-1)