我如何安全地从双精度类型转换为整数类型而没有任何数据丢失

时间:2019-05-11 20:40:47

标签: c++ int double

我有一个股票买卖程序,用户可以在其中说出他们希望买卖多少股票。一切工作正常,直到用户希望以5.10美元的价格以4.10美元的价格出售股票。为了使浮点运算更容易,我将double转换为int:10.10变为1010,依此类推。每当我将4.10转换为int时,它就会变成409,5.10也会发生同样的情况。

这笔钱存储在Dollars类中。在此类的内部,当我调用构造函数时,可以调用Dollars(int cents): cents(cents) {}Dollars(double dollars): cents(0) { *this = dollars; }。使用double构造函数时,它将使用以下cents = (int)(dollars * 100.0);将给定的double转换为int。

我曾尝试在类内部使用(int)(double) cast方法将其转换为int,并且我也曾尝试过使用int构造函数将其转换为int,但均无济于事。

当我将其强制转换为4.10时,我期望此转换的输出为410,但始终显示为4.09。

1 个答案:

答案 0 :(得分:1)

请勿将浮点数用作货币。另外4.10 * 100可能是409.999999 ...,并且转换为int会被截断。在这种情况下,您将通过首先调用std::round获得更精确的结果。它不能解决所有舍入错误。在某些情况下,仅由于double具有52位尾数并且int可以/将为64位(如果是针对x64平台进行编译),结果将是不正确的。

如果有支持,有时可以通过long double解决最后一个问题。那是sizeof(long double)>sizeof(double),不能保证。

最简单的正确实现是简单地使用uint64_t并进行所有计算,例如美分。然后所有数学运算都是精确的。在现实生活中,当银行计算利息时,它也会对结果进行四舍五入,因此不需要浮动精度。正确的打印如下: cout<<amount/100<<"dollars "<<amount%100<<"cents";