【问题标题】:Value changing when converting from double to int从 double 转换为 int 时值发生变化
【发布时间】:2013-01-11 04:53:31
【问题描述】:

基本问题,代码很大,但我的问题是基本的:

我有一个称为变量的双精度值,如果我用 cout

下一行代码是 int intvariable = variable。

然后,当我用 cout

有趣的是,这并不总是发生。使用 985,它可能会保持在 985,但在 984 和 983 时,它将返回 983 和 982。我似乎根本无法弄清楚这一点。我尝试将其转换为浮点数,然后转换为 int,或者转换为另一个 double,然后转换为 int。

我需要它作为一个整数,所以我可以使用它的模运算符。

我应该指出,之前在代码中双精度小于 1(即 0.987),然后乘以小数位数使其成为一个实数正整数(不过,它存储为双精度还在那个时候)。也许这与随机舍入有关?

【问题讨论】:

  • 我以前看过那个页面,我了解浮点数,但我仍然不知所措。为什么当我要求用 cout 查看数字(虽然它仍然是双精度数)时,它给了我 - 正是 - 我希望看到的数字,但在将其视为 int 时,它是不同的。我没有在两者之间做任何数学运算。
  • 正如您在问题中提到的,您的问题是四舍五入。不过,我不知道你为什么说“随机取整”。
  • 使用cout格式您的号码打印。请务必理解这意味着什么。
  • 浮点问题通常会导致像“5”这样的东西并不是真正的“5”,而是“5.00000008”之类的东西。如果你是准确的,这可能会很麻烦。在我的情况下,我有一个 double,其值为 955,但是当我将其转换为 int 时,它会丢失整个 1 的位置值,并下降到 954。你可以代表每个非十进制数作为一个整数,为什么我的程序似乎不能理解 955 = 955?它不应该采用浮点数(比如作为双精度数,955 实际上是 954.99999997 或其他东西),并将其作为整数 954。

标签: c++ int double


【解决方案1】:

将浮点值转换为int 将截断(返回)该值,这可能会导致您的问题,因为浮点数本质上是不精确的。尝试将数字四舍五入,即intvariable = (int)(0.5 + variable)。您可能还对 fmod 函数感兴趣,它计算浮点除法的余数(参见 http://www.cplusplus.com/reference/cmath/)。

【讨论】:

  • 啊,有趣...所以只需在数字上加一些额外的东西,以确保它位于正确的值之下。我喜欢这个答案。实际上,我刚刚通过使用 ceil(); 找到了解决方案;功能,这几乎是同一件事。感谢您了解问题并迅速解决!我知道这个答案可能不是在所有情况下都是最好的,但对于我的程序来说,这绝对是我需要的。
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 2020-04-05
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
相关资源
最近更新 更多