【问题标题】:Floating point division returns integer numbers [duplicate]浮点除法返回整数[重复]
【发布时间】:2017-05-06 15:07:53
【问题描述】:

我想计算两个浮点数的平均值,但无论输入什么,我都会返回一个整数。

我应该怎么做才能完成这项工作?

public class Program
{
    public static float Average(int a, int b)
    {
        return (a + b) / 2;
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(Average(2, 1));
    }
}

【问题讨论】:

  • “但这显然不是” - 您看到的错误消息或问题是什么?
  • 我将添加输出描述,因为它可能不够清楚

标签: c#


【解决方案1】:

诀窍是将表达式写为0.5 * a + 0.5 * b,这消除了int 溢出的可能性(承认Dmitry Bychenko)。

目前您的表达式是在整数算术中计算的,这意味着任何小数部分都将被丢弃。

在将每个术语中的一个值设置为浮点字面量时,整个表达式以浮点计算。

最后,如果你希望表达式的类型是float,那么使用

0.5f * a + 0.5f * b

f 后缀用于表示 float 文字。

【讨论】:

  • ...或(a + b) / 2.0
  • 有几种选择,但我喜欢将“进行转换的事物”视为表达式中的第一件事。
  • 感谢您的解释,我想补充一点,我必须将类型更改为双精度,因为我得到:错误:(15:16)无法隐式转换类型'双”到“浮动”。存在显式转换(您是否缺少演员表?)
  • @Leff:我在最后放了一些东西。
  • 再次感谢您的精彩解释!我会尽快接受你的回答。
【解决方案2】:

return (a + b) / 2F; 告诉编译器将该数字视为浮点数,否则将被视为int

【讨论】:

  • 我改了,判断是答主打错了。
【解决方案3】:

使用这个:

public static float Average(int a, int b)
{
    return (float)(a + b) / 2;
}

【讨论】:

  • 平均 (2,3) 返回 2.5。请检查。@MikhailNeofitov
  • 对不起。当然它是正确的,因为只有分子被转换为浮动
【解决方案4】:

您的代码有两个问题

  1. 明显一 - 整数除法 - 例如1 / 2 == 0 不是 0.5 因为结果必须是整数
  2. 隐藏一个 - 整数溢出 - 例如a + b 可以溢出 int.MaxValue 你会得到否定的结果

最准确的实现是

public static float Average(int a, int b)
{
    return 0.5f * a + 0.5f * b;
}

测试:

Average(1, 2);                       // 1.5
Average(int.MaxValue, int.MaxValue); // some large positive value 

【讨论】:

  • 我个人认为((float)a + (float)b) / 2.0 更具可读性,并且与原始代码更明显相似。如果这确实是一种改进,让编译器将除以 2 优化为乘以 0.5。 (在这种情况下,它甚至可能是过早的悲观。)
  • @Cody Gray:这个想法有很多可能的实现;唯一的问题是2.0 表示double,而不是float;所以你的版本应该是((float)a + (float)b) / 2.0f;(请注意f后缀)
【解决方案5】:

你可以使用:

(float)(a + b) / 2.0

这将返回浮点数

对不起,如果有人以相同的方式回答(我没有阅读所有答案)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多