C#自动向下取整除法

37

当我在 C# 中进行除法运算时,它会自动向下取整。请看以下示例:

double i;
i = 200 / 3;
Messagebox.Show(i.ToString());

这显示了一个包含“66”的消息框。200/3实际上是66.66666〜。

有没有办法避免四舍五入,保留像66.6666667这样的数字?


14
这里的重要教训不仅在于整数算术是用整数进行的,而是操作数的类型比结果分配给哪种类型更与程序分析相关。在 C# 中,我们几乎总是从“内部”推理到“外部”,我们不会说“哦,我看到你将其分配给一个 double,所以我会执行浮点算术”。相反,我们会说“我看到你正在除以两个整数;你肯定想要整数作为结果。哦,你想要这个整数作为 double?那么我们将把它转换为 double。” - Eric Lippert
我目前也在研究这个“问题”。从下面可以看出,我们知道为什么两个整数相除会得到一个整数,我对此感到满意。然而,我无法弄清楚以下问题:为什么C# / VB.Net将200/3四舍五入为66?我们知道,如果我们执行“200/3.0”,我们最终得到的是66.6666667。那么为什么它被舍入为66,而不是四舍五入为67?如果我执行以下操作,我最终得到的是67:Convert.ToInt32(200 / 3.0)所以我的小数转换成整数变成了67,但运行时会将我的数字转换为66? - Oxonhammer
非常相关(尽管那个问题询问的是原因而不是如何修复它) - user202729
10个回答

61

i = 200 / 3 执行整数除法。

尝试以下任一方法:

i = (double)200 / 3

或者

i = 200.0 / 3

或者

i = 200d / 3

将其中一个常量声明为 double 类型将会使用双精度浮点数除法运算符。


8

200/3 是整数除法,结果是一个整数。

尝试 200.0/3.0


或者 200 / 3.0。或者 200.0 / 3。或者 (double) 200 / 3。或者 200 / (double) 3。或者你想怎么做都可以。 - JAB
@JAB 没时间思考,只能先赶到那里 :) - John Boker
我猜他是新来的,规则是第一个发布正确答案的人获胜...对吧? - John Boker

6

200 / 3 这是整数除法。将其改为: 200.0 / 3 可以使其变为浮点数除法。


6
您可以指定所需小数位数的格式字符串:
double i;
i = 200 / 3.0;
Messagebox.Show(i.ToString("F6"));

4
虽然正确答案实际上是66.666,但实际上计算的是200/3的结果,其结果是整数。该整数随后被放入浮点数中。这个过程中使用了整数运算。如果要将其变成浮点数,请使用200.0 / 3。小数点后面的0会使200被视为浮点数,从而得到浮点数运算。

4

2

双精度变量i = 200.0 / 3;

双精度变量i = ((double)200)/3;

发生的情况是两个整数进行整数除法,然后将整数答案分配给浮点数。为了避免这种情况,始终将其中一个数强制转换为双精度。


1

试试这个

i = 200d/3d;

它不会四舍五入。


0

200和3都是整数,因此结果也将是一个整数。将其中一个转换为十进制。


-2

所有给出的答案都是错误的,因为它们将整数除法转换为一种双精度类型,从性能角度来看这显然不是所要求的。显而易见的答案是小学数学,乘以10,加上5再次除以整数。

i = (2000 / 3 + 5 ) / 10

你在这里捕捉到了第二个除法,这比进行双重转换要好得多,但仍然远非完美。你甚至可以通过乘以另一个因子并添加其他值,从而允许你使用右移而不是除以10。如何实现这一点的确切公式留给读者作为练习。(只需谷歌“带乘法位移的除法”)

祝您拥有愉快的一天。


1
不。从 OP 的示例代码中可以清楚地看出,他想要一个 double 结果,而不是截断为 int - Mike Cowan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接