为什么 .0 在除法中被舍弃而不是在 +、- 和 * 中?

Why .0 is dropped in division but not in +, - and *?

因此,根据 C# 规则,在除法(int 和 int 除法)中输出是一个 int。而在(FP & int division)中,则为FP。

但以下生成不同的输出。

int a = 45; //integer
decimal b = 5.0m; //floating point
Console.WriteLine(a/b); // "9"

Output is: 9 //输出看起来像一个整数???为什么?

请注意 +、- 和 * 产生预期结果:

  Console.WriteLine(a * b); // "225.0"

除以非整数产生预期结果:

int a = 45; //integer
decimal b = 5.5m; //floating point
Console.WriteLine(a/b); // "8.181818181818181818"

输出是:8.181818181818181818 - /输出是一个 FP,没问题。

谁能解释一下?

float / double 的结果更一致 - 所有操作的输出都没有零(这是有道理的,因为这些类型不存储小数点后位数的信息)

我测试得到这个结果

int a = 45; //integer
    decimal b = 5.0m; //floating point
    var r=a/b; // r is decimal
    Console.WriteLine(r);  // 9


 a = 45; //integer
     b = 5.5m; //decimal floating point
     r=a/b;   // r is decimal
    Console.WriteLine(r);  // 8.181818181818181818181818182

正如我在调试器中看到的那样,两种情况下的输出都是十进制,在第一种情况下也不是整数

如果结果未在代码中明确定义,编译器将进行隐式转换。有很多方法可以转换类型。这里的主要规则是 'if there are several operands in the expression, then the type of the result is the largest of the operand types'。例如,如果除以 int 和 double,则结果为 double。如果将 byte 和 int 相乘,结果是 int。

更多示例(现在有 multiply)

    int a = 45; //integer
    
    decimal b = 5.0m; //floating point
    var rm = a*b; // rm is decimal
    Console.WriteLine(rm);  // 225.0
        
    b = 5.5m; //decimal floating point
    var r2m = a*b; // r2m is decimal
    Console.WriteLine(r2m);  // 247.5

更新

由于@AlexeiLevenkov 对问题进行了重大更改,他在评论中问我为什么 .0 在除法中被删除,这些例子表明这不是真的

 int a = 5; //integer


 decimal b = 45m; //floating point
 var r= b/a; // r is decimal
Console.WriteLine(r);  //  9


 b = 45.0m; //floating point
  r= b/a; // r is decimal
Console.WriteLine(r);  //  9.0

 b = 45.00m; //floating point
 var r= b/a; // r is decimal
Console.WriteLine(r);  //  9.00

 b = 45.000m; //floating point
 var r= b/a; // r is decimal
Console.WriteLine(r);  //  9.000

这些示例表明,默认情况下,商的零点与被除数的零点一样多。

更新 2

如果你尝试这样做,你会得到错误“无法将十进制类型隐式转换为 int

int r = a/b; // error!!!

但这没关系

int r = a/(int)b; 

这个也可以

decimal r = a/b; 

C# 标准在 section 12.9.3 中详细介绍。

The scale of the result, before any rounding, is the closest scale to the preferred scale that will preserve a result equal to the exact result. The preferred scale is the scale of x less the scale of y.

因此,为了应用它,我们得到 x 的值为 45m(在隐式转换为 decimal 之后),其比例为 0,并且 5.0m比例为 1.

因此首选比例是 -1 - 这将是无效的。 (比例始终为非负数。)可以保留精确结果的最接近比例为 0,因此这就是 actual 比例 - 结果相当于 9m 而不是9.0m.

int a = 45; //integer
decimal b = 5.0m; //floating point
Console.WriteLine(a/b); // why "9" and not 9.0 right?

所以如果我问你,你会用 5.0 乘以什么得到 45?你会说 9 还是 9.0?

通俗地说,商保持整数,除非存在余数。

现在让我们看看十进制有什么独特之处。

double x = 10.0d; // is 10

但是

decimal x = 10.0m; //is 10.0 

Formula for decimal : x.0m is x.0 and xm is x

Formula for double/float : x.0d or xd is x

现在应用上面的公式,看看这些案例...

10.0d + 10.0d + 10.0d ( x.0d is x )

10 + 10 + 10 = 30

10.0d + 10.1d + 10.0d ( x.0d is x )

10 + 10.1 + 10 = 30.1

45 * 5.0d ( x.0d is x )

45 * 5 = 255

但是...

10.0m + 10.0m + 10.0m ( x.0m is x.0 )

10.0 + 10.0 + 10.0 = 30.0

10.0m + 10.1m + 10.0m ( x.0m is x.0 )

10.0 + 10.1 + 10.0 = 30.1

45 * 5.0m ( x.0m is x.0 )

45 * 5.0 = 255.0

45 * 5m ( xm is x )

45 * 5 = 255

现在想到除法过程...

Its divisor * (quotient(0...+/-n)) till remainder becomes 0 or smaller than divisor

45/5.0m

5.0m * 1m..2m..3m...9m and the remainder becomes 0 here. END. last quotient is 9m.

但是 9m 仍然是 9 而不是 9.0 对吗?