C++ 如何在不丢失任何数据的情况下安全地将double转换为int

C++ 如何在不丢失任何数据的情况下安全地将double转换为int,c++,int,double,C++,Int,Double,我有一个股票买卖程序,用户可以说他们希望买卖多少股票。一切正常,直到用户想以4.10美元5.10美元的价格卖出一只股票。为了简化浮点运算,我将double转换为int:10.10变成1010,以此类推。每当我将4.10转换为int时,它就会变成409,而5.10也是如此 钱存储在一个类中,美元。在这个类中,当我调用构造函数时,我可以调用Dollars(int-cents):cents(cents){}或Dollars(double-Dollars):cents(0){*this=Dollars;

我有一个股票买卖程序,用户可以说他们希望买卖多少股票。一切正常,直到用户想以4.10美元5.10美元的价格卖出一只股票。为了简化浮点运算,我将double转换为int:10.10变成1010,以此类推。每当我将4.10转换为int时,它就会变成409,而5.10也是如此

钱存储在一个类中,美元。在这个类中,当我调用构造函数时,我可以调用
Dollars(int-cents):cents(cents){}
Dollars(double-Dollars):cents(0){*this=Dollars;}
。当使用双构造函数时,它使用以下
cents=(int)(美元*100.0)
将给定的双精度转换为int

我曾尝试在类中使用
(int)(double)
cast方法将其转换为int,以前我也尝试过将其转换为int,并使用int构造函数,但两者都不起作用


当我将其输入4.10时,我预计该cast的输出为410,但它总是输出为4.09。

不要使用浮动作为货币。另外,4.10*100很可能是409.999999。。。而转换为int只是截断。在这种情况下,首先调用
std::round
可以得到更精确的结果。它无法解决所有舍入错误。在某些情况下,结果仍然不正确,因为
double
有52位尾数,如果为x64平台编译,
int
可以/将是64位

最后一个问题有时可以通过
long double
解决,如果有支持的话。即
sizeof(长双精度)>sizeof(双精度)
,这是不保证的

最简单正确的实现方法是简单地使用
uint64\t
,并以美分等单位进行所有计算。那么所有的数学运算都是精确的。在现实生活中,当银行计算利息时,它也会对结果进行四舍五入,因此不需要浮动精度。正确的打印是:
coutSee查看最新版本。您的客户簿记员会心存感激并感到满意。不要使用浮动货币。而且
4.10*100
很可能是
409.999999…
,转换为int只需截断。在这种情况下,首先调用
std::round
@Quimby,你会得到更精确的结果,我想知道,为什么很多人会将他们的正确答案作为评论发布(你也是这样做的)?这样一来,许多问题最终没有得到回答,而正确的答案在评论中。@Dmitry我希望这个答案以重复或类似的方式结束。只有两行,似乎还不够回答。但你可能是对的。