在C ++错误中乘以双精度数

时间:2015-11-27 01:48:31

标签: c++ precision multiplication

我有一个看似简单的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个小数位) 。

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)

尝试使用cout<<setprecision(12)<<c<<endl;

setprecision设置用于在输出操作上格式化浮点值的小数精度。

source