我有一个股票买卖程序,用户可以在其中说出他们希望买卖多少股票。一切工作正常,直到用户希望以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。
答案 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";