【问题标题】:How do I safely cast from a double to an int without any data loss如何安全地从 double 转换为 int 而不会丢失任何数据
【发布时间】:2019-09-29 08:07:20
【问题描述】:

我有一个股票买卖程序,用户可以在其中说出他们希望买卖多少股票。一切正常,直到用户想以 5.10 美元的价格以 4.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); 将给定的 double 类型转换为 int。

我尝试在类中使用(int)(double) cast 方法转换为int,我之前也尝试过转换为int,并使用int 构造函数,但都没有成功。

当我喂它 4.10 时,我希望这个演员的输出是 410,但它总是输出到 4.09。

【问题讨论】:

  • 查看Money Pattern。您的客户簿记员会感激不尽并感到满意。
  • 不要使用浮点数作为货币。 4.10*100 也可能是 409.999999... 并且转换为 int 只是截断。在这种情况下,您将首先调用std::round 获得更精确的结果
  • @Quimby,我想知道,为什么许多人将他们的正确答案发布为 cmets(你也这样做)?这样很多问题最终都没有答案,而正确的答案在 cmets 中。
  • @Dmitry 我希望这个答案会以重复或类似的方式关闭。它只有两行,似乎不足以回答。但你可能是对的。

标签: c++ int double


【解决方案1】:

不要使用浮点数作为货币。 4.10*100 也可能是 409.999999... 并且转换为 int 只是截断。在这种情况下,您将首先调用std::round 获得更精确的结果。它不会解决所有舍入错误。仍然会有结果不正确的情况,因为 double 具有 52 位尾数,而 int 如果针对 x64 平台编译,则可以/将是 64 位。

如果有支持,long double 有时可以解决最后一个问题。那是sizeof(long double)>sizeof(double),这是无法保证的。

最简单的正确实现是简单地使用uint64_t 并在例如美分。那么所有的数学运算都是精确的。在现实生活中,当银行计算利息时,它也会对结果进行四舍五入,因此不需要浮动精度。正确的打印是: cout<<amount/100<<"dollars "<<amount%100<<"cents";

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2013-09-15
    • 2019-10-23
    相关资源
    最近更新 更多