【问题标题】:Multiplication on floating numbers returns unexpected result浮点数乘法返回意外结果
【发布时间】:2012-10-13 00:02:21
【问题描述】:
int countBouncy=5;
int count=999899;

double percent = (double)(countBouncy / count) * 100.0;

那句话的结果出乎意料,我得了零。

为什么它不起作用?

【问题讨论】:

  • 它工作正常,真的。然而你的期望是错误的。

标签: c# floating-point double


【解决方案1】:

您正在对(countBouncy / count) 进行整数除法。将您的代码更改为

double percent = ((double)countBouncy / count) * 100.0;

这样,countBouncy 显式转换为doublecount 由 c# 编译器隐式转换为double,以使其与(现在为doublecountBouncy 兼容。

否则(countBouncy / count) 计算为(5 / 999899) --> 0,因为两者都是整数。


整数除法是如何工作的?举个例子:

7 / 2 = 3

整数除法会去掉实数除法产生的小数部分。结果被截断为零。您可以使用模运算符获得此除法的余数

7 % 2 = 1

并像这样执行反向计算

2 * (7 / 2) + 7 % 2 = 7

您可以在 Visual Studio 的即时窗口中输入它来测试它:

?2 * (7 / 2) + 7 % 2
7

【讨论】:

  • 你确定你的意思是int percent
  • 我的意思是double percent。可能我复制粘贴了一个早期的错误版本。感谢您的评论。
【解决方案2】:

因为您的除法是整数除法,结果为 0,您然后将其转换为双精度数。

您当前的代码实际上与以下代码相同:

int temp = countBouncy / count;  // == 0
double percent = (double)temp * 100.0;

您是否先对其中一个项目施放:

double percent = ((double)countBouncy / count) * 100.0;

这将导致您的除法预先以双精度完成。

【讨论】:

    【解决方案3】:

    当您将int 除以int 时,结果始终是int,因此它会向下舍入到最接近的整数(零)。试试这个:

    ((double)countBouncy / count) * 100.0;
    

    【讨论】:

      【解决方案4】:

      你的分子和分母都是ints。因此,得到的商是 int,C# 通过向下舍入到 0 来计算。另外,您正在尝试将 double 类型分配给 int 类型。为了达到您想要的结果,请执行以下操作:

      double percent = ((double) countBouncy / count) * 100.0;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-26
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多