Why do these division equations result in zero?
下面for循环中所有的除法方程的结果都是0。我怎样才能让它给我一个小数,例如:
1 | 297 / 315 = 0.30793650793650793650793650793651 |
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | using System; namespace TestDivide { class Program { static void Main(string[] args) { for (int i = 0; i <= 100; i++) { decimal result = i / 100; long result2 = i / 100; double result3 = i / 100; float result4 = i / 100; Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", i, 100, i / 100, result, result2, result3, result4); } Console.ReadLine(); } } } |
答:
谢谢乔恩和所有人,这就是我想做的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | using System; namespace TestDivide { class Program { static void Main(string[] args) { int maximum = 300; for (int i = 0; i <= maximum; i++) { float percentage = (i / (float)maximum) * 100f; Console.WriteLine("on #{0}, {1:#}% finished.", i, percentage); } Console.ReadLine(); } } } |
您使用的是int/int,它在整数算术中执行所有操作,即使您要分配给一个十进制/双精度/浮点变量。
强制其中一个操作数为要用于算术的类型。
1 2 3 4 5 6 7 8 9 | for (int i = 0; i <= 100; i++) { decimal result = i / 100m; long result2 = i / 100; double result3 = i / 100d; float result4 = i / 100f; Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", i, 100, i / 100d, result, result2, result3, result4); } |
结果:
1 2 3 4 5 6 | 0/100=0 (0,0,0, 0) 1/100=0.01 (0.01,0,0.01, 0.01) 2/100=0.02 (0.02,0,0.02, 0.02) 3/100=0.03 (0.03,0,0.03, 0.03) 4/100=0.04 (0.04,0,0.04, 0.04) 5/100=0.05 (0.05,0,0.05, 0.05) |
(等)
请注意,这并没有显示由float或double表示的确切值-例如,您不能准确地表示0.01作为float或double。字符串格式有效地将结果四舍五入。有关更多信息,请参阅我在.NET浮动二进制点上的文章,以及一个类,它将让您看到double的确切值。
我没有费心为
尝试
1 | i / 100.0 |
因为
1 | i / 100.0 |
因为我是一个整数,100是一个整数,所以你有一个整数除法。
改为尝试(十进制)i/100.0
您需要强制浮点运算"double/double"而不是"int/int"
1 | double result = (double)297 / (double)315 ; |
无论您将其存储在何处,一个整数除以一个整数都将始终是一个整数。
在我的例子中,我只有vars,没有int
1 | float div = (var1 - var2) / float.Parse(var1.ToString()); |
1 | double result3 = ((double)i) / 100; |
这是整数除法,无论您存储的变量类型是什么,所以int/int=int
因为我是一个int值,你除以一个整数,结果就是一个整数!所以您需要除以100.0才能有一个隐式的浮点强制转换,或者指定100f或100d。