- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个股票买卖程序,用户可以在其中说出他们希望买卖多少股票。一切正常,直到用户想要以 4.10 美元的价格以 5.10 美元的价格出售股票。为了更轻松地使用 float 进行数学运算,我将 double 型转换为整数:10.10 变为 1010,依此类推。每当我将 4.10 转换为 int 时,它都会变成 409,对于 5.10 也会发生同样的情况。
钱存储在一个类 Dollars 中。在此类内部,当我调用构造函数时,我可以调用 Dollars(int cents): cents(cents) {}
或 Dollars(double dollars): cents(0) { *这=美元; }
。使用 double 构造函数时,它使用以下 cents = (int)(dollars * 100.0);
将给定的 double 转换为 int。
我尝试过在类中使用 (int)(double)
cast 方法转换为 int,我也尝试过转换为 int,并使用 int 构造函数, 但都没有用。
当我输入 4.10 时,我预计此转换的输出为 410,但结果总是 4.09。
最佳答案
不要对货币使用 float 。 4.10*100 也可能是 409.999999... 并且转换为 int 只是截断。在这种情况下,您将通过首先调用 std::round
获得更精确的结果。 .它不会解决所有舍入错误。仍然会有结果不正确的情况,仅仅因为 double
有 52 位尾数和 int
如果为 x64 平台编译,可以/将是 64 位。
最后一个问题有时可以通过 long double
来解决如果有支持的话。即sizeof(long double)>sizeof(double)
这是不能保证的。
最简单的正确实现是简单地使用 uint64_t
并进行所有计算,例如美分。那么所有的数学运算都是精确的。在现实生活中,当银行计算利息时,它也会对结果进行四舍五入,不需要 float 精度。那么正确的打印是: cout<<amount/100<<"dollars "<<amount%100<<"cents";
关于c++ - 如何在不丢失任何数据的情况下安全地从 double 转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56094124/
我是一名优秀的程序员,十分优秀!