首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不丢失任何数据的情况下安全地从double类型转换为int类型

如何在不丢失任何数据的情况下安全地从double类型转换为int类型
EN

Stack Overflow用户
提问于 2019-05-12 04:40:47
回答 1查看 63关注 0票数 0

我有一个股票买卖程序,用户可以说出他们想要买卖多少股票。一切正常,直到用户想以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。

EN

回答 1

Stack Overflow用户

发布于 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";

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56094124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档