为什么在除法中省略.0而在+,-和*中不省略?



所以,根据c#规则,在除法(int &整型除法)则输出为整型。而在(FP &int除法),它是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.18181818181818181818 -/输出是一个FP,这是可以的。

有人能解释一下吗?

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

c#标准在12.9.3节中有详细说明。

在任何舍入之前,结果的比例是最接近于保持结果等于确切结果的首选比例。首选量表为x量表减去y量表。

因此,为了应用它,我们得到了x的值为45m(在隐式转换为decimal之后),其刻度为0,5.0m的刻度为1。

因此首选的刻度是-1 -这将是无效的。(比例总是非负的。)能保持精确结果的最接近的比例是0,所以这是实际的比例——结果相当于9m而不是9.0m

我测试了一下,得到了这个结果

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

正如我在调试器中看到的,这两种情况下的输出都是十进制,而不是整数

如果结果没有在代码中显式定义,编译器会进行隐式转换。有很多方法可以强制转换类型。这里的主要规则是"如果表达式中有几个操作数,那么结果的类型是操作数类型中最大的"。例如,如果将int和double除以,结果是double。如果将byte和int相乘,结果为int。

更多的例子(现在有乘法)

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

如果你尝试这样做,你会得到错误"不能隐式地将类型decimal转换为int

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

但这是可以的

int r = a/(int)b; 

这个也可以

decimal r = a/b; 
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 ?

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

现在让我们看看小数有什么独特之处

double x = 10.0d; // is 10

,

decimal x = 10.0m; //is 10.0 

十进制公式:x.0m is x.0 and xm is x

double/float公式:x.0d or xd is x

现在应用上面的公式,看看这些情况…

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

10 + 10 + 10 = 30

10.0 d + 10.1 + 10.0 d( 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

45 * 5m( xm is x )

45 * 5 = 255

现在想想除法过程…

它的除数*(商(0…+/-n))直到余数变为0或小于除数

45/5.0m

5.0米* 1米,2米,3米……9m,余数变成0。结束。最后一个商是9m

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

相关内容

最新更新