【问题标题】:Converting float to int in C++ [duplicate]在C ++中将float转换为int [重复]
【发布时间】:2017-06-12 12:21:13
【问题描述】:

我说的是转换已经存储整数值的浮点数(如 10.0) 我需要这样做,因为我想创建一个反转给定整数的简单函数,它使用如下代码行:ans += x % (int)pow(10, i);(% 运算符需要两个参数都是整数,并且 pow 返回一个双)

C++ 不太乐意正确地进行这种转换。对于pow(10, 4),我得到的值是9999,这很烦人。为什么会发生此错误很明显,10^4 必须已存储为 9999.999999... 或类似的东西。我可以通过使用lround() 函数来修复此错误,但这不是最佳解决方案,因为如果我忽略了类似的错误怎么办?

有没有办法用 C++ 做数学而不用担心这些琐事?如果不是,我应该选择什么语言来进行这样的计算?我在 python 中简要使用了 bigInt 库。有关使用哪种语言和库来解决此问题的任何建议都会非常有帮助。

【问题讨论】:

  • lround 似乎正是您所需要的——您为什么说它“不是最佳的”?
  • 在浮点精度方面,大多数其他语言都会遇到类似的问题。
  • @AayushMahajan 二进制浮点数在绝大多数情况下无法准确表示十进制浮点数。所以你有 3 个选择:(1) 放弃浮点并使用多精度整数运算,(2) 了解二进制浮点是什么并确定它是否满足你的需要或 (3) 使用第 3 方多精度(big-编号)图书馆,
  • “如果我忽略了类似的错误怎么办?” 你怎么能忽略它?你必须在int 中插入一个明确的演员表,所以只需训练自己进行四舍五入而不是演员表。不会再慢了。看起来很简单的演员表不是免费的。

标签: c++ math integer


【解决方案1】:

在其他语言中,您有用于进行精确数学运算的类型,例如在 C# 中您有 decimal 和在 Java 中 BigDecimal 类型。所以这样的问题:

printf (" %.20f \n", 3.6);
--> 3.60000000000000008882

0.1 + 0.2
--> 0.30000000000000004

不会发生。

在 C++ 中,您可以使用例如:The GNU Multiple Precision arithmetic libraryBoost.MultiprecisionDecimalForCPP (header only)。当然还有更多可用的库。

如果您使用此类类型,请记住它们比不准确的浮点类型要慢。但是,例如,如果您使用金钱工作,那是必须的!

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2021-10-12
    • 2019-12-04
    • 2011-08-09
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多