C++ 双精度整数乘法
我有一双3.4的。然而,当我把它乘以100,它得到的是339而不是340。这似乎是由于双精度造成的。我怎样才能避开这件事C++ 双精度整数乘法,c++,C++,我有一双3.4的。然而,当我把它乘以100,它得到的是339而不是340。这似乎是由于双精度造成的。我怎样才能避开这件事 谢谢如果您需要全精度,您可能需要使用类似的方法。您可以使用两个整数并将小数部分乘以乘法器/10 例如 如果你真的想要小数点两边的精度。确实取决于应用程序。浮点值很少是精确的。不幸的是,在C中将浮点值强制转换为整数时,该值会向零舍入。这意味着如果您有339.999999,则强制转换的结果将为339 为了克服这个问题,您可以从该值中添加(或减去)“0.5”。在本例中,339.99
谢谢如果您需要全精度,您可能需要使用类似的方法。您可以使用两个整数并将小数部分乘以乘法器/10 例如
如果你真的想要小数点两边的精度。确实取决于应用程序。浮点值很少是精确的。不幸的是,在C中将浮点值强制转换为整数时,该值会向零舍入。这意味着如果您有339.999999,则强制转换的结果将为339 为了克服这个问题,您可以从该值中添加(或减去)“0.5”。在本例中,339.99999+0.5=>340.499999=>340(转换为int时)
或者,您可以使用标准库提供的多种转换函数之一。首先,发生了什么:
#include <cmath>
int round(double x) { std::floor(x + 0.5); } // floor is provided, round not
#包括
int round(双x){std::floor(x+0.5);}//提供了floor,而不是round
或
int-round(双x){返回x<0?x-0.5:x+0.5;}
我不能完全确定它确实是向零舍入的,所以如果您使用它,请验证后面的值。您没有值为3.4的double,因为3.4不是 可表示为双精度(至少在普通机器上,以及 大多数异国情调也一样)。你所拥有的是一些非常有价值的东西 接近3.4。在乘法之后,你有一些非常重要的值 接近340。但肯定不是399 你在哪里看到399?我猜你只是 使用
static\u cast
将强制转换为int
,因为此操作
向零截断。其他行动可能会做什么
您需要:以固定格式输出,在
例如,十进制(在定义的实现中)
方式,但我知道的所有实现都使用循环到平衡
默认情况下);函数舍入
舍入到最近的舍入
在一半的情况下远离零(但您的结果不会
任何接近一半的地方)。这是在中使用的舍入
商业应用
真正的问题是你在做什么,这需要一个准确的答案
整数值。根据应用程序的不同,它可能会更复杂
适合使用int
或long
,将实际值缩放为
必要(即存储实际值的100倍,或
无论如何),或者某种十进制算术软件包
使用
double
您的原始值可能是3.399999,您可以显示一些代码吗请…您没有3.4的double,因为该数字不能准确表示为double。这就是问题所在。你应该阅读“每个程序员都应该知道的关于浮点运算的知识”,只检查一个nit,但浮点值总是精确的。它们并不是你想要的价值。
#include <cmath>
int round(double x) { std::floor(x + 0.5); } // floor is provided, round not
int round(double x) { return x < 0 ? x - 0.5 : x + 0.5; }