所以,根据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,对吗?