我有一个股票买卖程序,用户可以说出他们想要买卖多少股票。一切正常,直到用户想以4.10美元5.10美元的价格出售股票。为了更容易地处理浮点数,我将双精度数转换为整数: 10.10变成1010,依此类推。每当我将4.10转换为int时,它就会变成409,5.10也会发生同样的情况。
钱被存储在一个类中,即美元。在这个类的内部,当我调用一个构造函数时,我可以调用Dollars(int cents): cents(cents) {}
或Dollars(double dollars): cents(0) { *this = dollars; }
。当使用double构造函数时,它使用下面的cents = (int)(dollars * 100.0);
将给定的双精度值转换为整型。
我已经尝试过在类中使用(int)(double)
强制转换方法来转换成一个整数,我之前也尝试过转换成一个整数,并使用了int构造函数,但都没有成功。
当我输入4.10时,我预计这个强制转换的输出是410,但它总是输出到4.09。
发布于 2019-05-12 18:57:32
不要使用浮点数作为货币。同样4.10x100很可能是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";
https://stackoverflow.com/questions/56094124
复制相似问题