为什么 .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 对吗?
因此,根据 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 ofy
.
因此,为了应用它,我们得到 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 对吗?