我正在尝试用C ++编写一个计算器来执行/,*, - 或+的基本功能,并显示两个小数位的答案(精度为0.01)。
例如,var base64 = "data:image/jpeg;base64,/9j/4AAQSkZJ.....";
var canvas = document.createElement('canvas');
var ctx = canvas.getContext("2d");
var image = new Image();
image.onload = function () {
canvas.width = this.naturalWidth;
canvas.height = this.naturalHeight;
ctx.drawImage(this, 0, 0);
};
image.src = base64;
$('#showImage').html(canvas);
应将结果打印为100.1 * 100.1
,但我会得到10020.01
。根据我的理解,这来自溢出,但这就是我首先选择-4e-171
的原因!
long double
答案 0 :(得分:4)
setprecision
告诉它您想要int
的小数位数,因此setprecision(0)
被截断后,您实际将其设置为0.01
。在您的情况下,您希望它设置为2.您还应该使用std::fixed
或者您将获得科学数字。
void printResult(long double x)
{
cout << "The answer is: " << std::fixed << setprecision(2) << x << "\n";
}
答案 1 :(得分:2)
这不是因为溢出而得到了奇怪的结果。双打可轻松保存您所显示范围内的数字。
尝试在没有setprecision的情况下打印结果。
编辑: 尝试后
long double x = 100.1;
cout << x << endl;
我发现它在我的Windows系统上无效。
所以我搜索了一下,发现:
也许这就是解释。
所以我试过
long double x = 100.1;
cout << (double)x << endl;
工作得很好。
第二次编辑:
另见Raphael提供的链接
答案 2 :(得分:2)
默认浮点演示文稿会在314.15
和3.1e2
等演示文稿之间自动切换,具体取决于数字的大小和可以使用的最大位数。使用此演示文稿,精度是最大位数。默认情况下是6。
您可以增加最大位数,以便您的结果可以显示为314.15
,也可以使用std::fixed
操纵器强制使用此类固定点表示法。使用std::fixed
时,精度是小数位数。
但是,std::fixed
非常大且非常小的数字可能非常难以理解。
答案 3 :(得分:1)
setprecision()
操纵器指定小数点后的位数。因此,如果您希望打印100.01
,请使用setprecision(2)
。
当您使用setprecision(0.01)
时,值0.01
正在转换为int
,其值为0
。
如果您实际阅读了setprecision()
的文档,那就不会有什么坏处 - 它明确指定了int
参数,而不是浮点数。