C# is rounding down divisions by itself
当我在C做一个除法时,它会自动向下舍入。请参见以下示例:
1 2 3 | double i; i = 200 / 3; Messagebox.Show(i.ToString()); |
这显示了一个包含"66"的消息框。200/3实际上是66.66666~然而。
有没有一种方法可以避免这种取整,并保留66.6666667这样的数字?
尝试:
或
或
将其中一个常量声明为double将导致使用double除法运算符。
200/3是整数除法,产生一个整数。
尝试200 / 3
可以使用所需的小数位数指定格式字符串:
1 2 3 | double i; i = 200 / 3.0; Messagebox.Show(i.ToString("F6")); |
这是一个整数除法。改为:
除了在那个动作中发生的double和int,你认为double是一个精确的单位。当您真正关心准确性时,请尝试使用decimal数据类型。
有关此答案的详细信息:十进制与双精度!-我应该用哪一个?什么时候用?
虽然答案实际上是66.666,但实际情况是,200/3的计算结果是一个整数。然后将整数放入浮点中。数学本身是以整数数学的形式发生的。要使其成为浮点数,请使用200.0/3。.0将使它将200视为浮点,从而产生浮点数学。
双i=200.0/3;
双I=(双)200)/3;
所发生的是两个整数执行整数除,然后将整数答案分配给浮点。要避免这种情况,请始终将其中一个数字强制转换为双精度数。
试试这个
1 | i = 200d/3d; |
它不会转。
200和3都是整数,所以结果将是一个整数。将其中一个转换为十进制。
所有给定的答案都是错误的,因为它们将整数除法转换为一种类型的双精度除法,这完全不是所要求的(至少从性能角度而言)。显而易见的答案是小学数学,乘以10,加5再除以,都是整数。
I=(2000/3+5)/10
你在这里得到了第二个除法,这比做两次转换要好,但还远远不够完美。你可以更进一步,乘以另一个因子,再加上5以外的其他值,这样你就可以使用右移而不是除以10。这样做的确切公式留给读者作为练习。(只需google"带乘法移位的除法")。
祝您有个美好的一天。