一个简单的C#语句的效果出乎意料
我有一行代码:一个简单的C#语句的效果出乎意料,c#,line,division,multiplication,C#,Line,Division,Multiplication,我有一行代码: int WStoneCost = PriceMethod.StoneCost / 100 * AP; 而PriceMethod.StoneCost等于25,AP等于70。 我已经用断点检查过了,我不明白为什么我在运行这一行之后得到零。(WStoneCost等于零) 这只是一个错误的符号还是我做错了什么?提前谢谢。 最后如何得到正确的双精度?比如17.5你在做整数除法,所以25/100是0,而不是0.25,因此0*70是0。由于您的结果变量也是一个int,因此不清楚您期望的结果是
int WStoneCost = PriceMethod.StoneCost / 100 * AP;
而PriceMethod.StoneCost等于25,AP等于70。
我已经用断点检查过了,我不明白为什么我在运行这一行之后得到零。(WStoneCost等于零)
这只是一个错误的符号还是我做错了什么?提前谢谢。
最后如何得到正确的双精度?比如17.5你在做整数除法,所以
25/100
是0
,而不是0.25
,因此0*70
是0
。由于您的结果变量也是一个int
,因此不清楚您期望的结果是什么,但您可以重新排序操作以获得非零答案:
int WStoneCost = (PriceMethod.StoneCost * AP)/ 100 ;
它仍然是整数除法,但如果输入25*70(1750)除以100,则得到17
如果需要浮点十进制结果,只需使用100m
:
decimal WStoneCost = (PriceMethod.StoneCost * AP)/ 100m ;
由于文本
100m
是一个decimal
,编译器将使用浮点十进制除法,这将给您一个decimal
结果。您正在进行整数除法,因此25/100
是0
,而不是0.25
,因此0*70
是0
。由于您的结果变量也是一个int
,因此不清楚您期望的结果是什么,但您可以重新排序操作以获得非零答案:
int WStoneCost = (PriceMethod.StoneCost * AP)/ 100 ;
它仍然是整数除法,但如果输入25*70(1750)除以100,则得到17
如果需要浮点十进制结果,只需使用100m
:
decimal WStoneCost = (PriceMethod.StoneCost * AP)/ 100m ;
由于文本
100m
是一个十进制
,那么编译器将使用浮点十进制除法,这将给您一个十进制
结果。我同意JonathanWood的观点。根据您提供的值,您的答案将生成一个小数。因此,您需要WStoneCost是double或float。此外,您可能希望在方程式中使用partenthese,以确保按照您的期望执行操作顺序
希望这有帮助
-诗人加里我同意乔纳桑伍德的观点。根据您提供的值,您的答案将生成一个小数。因此,您需要WStoneCost是double或float。此外,您可能希望在方程式中使用partenthese,以确保按照您的期望执行操作顺序 希望这有帮助 -诗人加里 最后如何得到正确的双精度?像17.5 你的问题和目前给出的两个答案都表明你们三个都想做一些危险的错误您正在进行财务计算,因此应始终使用
十进制
,切勿使用双精度
双精度
用于物理计算,而不是财务计算
最后如何得到正确的双精度?像17.5
你的问题和目前给出的两个答案都表明你们三个都想做一些危险的错误您正在进行金融计算,因此您应该始终使用
十进制
,切勿使用双精度
双精度
用于物理计算,而不是金融计算。可能您的一些变量是整数而不是浮点<代码>(int)(25/100)等于0。@JonathanWood:我认为有100%的可能性。它们都是整数。对不起,我是新手。@paqogomez不,*
和/
运算符是从左到右应用的,因此它相当于(25/100)*70
@paqogomez-它真的优先于乘法而不是除法吗?当我运行这行代码时:double WStoneCost=25.0/100.0*70代码>结果为17.5。我的理解是,乘法和除法具有同等的优先级,因此按照从左到右的顺序执行。(D Stanley比我强!)也许你的一些变量是整数而不是浮点<代码>(int)(25/100)
等于0。@JonathanWood:我认为有100%的可能性。它们都是整数。对不起,我是新手。@paqogomez不,*
和/
运算符是从左到右应用的,因此它相当于(25/100)*70
@paqogomez-它真的优先于乘法而不是除法吗?当我运行这行代码时:double WStoneCost=25.0/100.0*70代码>结果为17.5。我的理解是,乘法和除法具有同等的优先级,因此按照从左到右的顺序执行。(D Stanley打败了我!)只需将变量类型更改为double
不会更改结果值-它仍将使用整数除法,但随后会将int
0转换为double
0。我必须将100设置为100.0,这将是一个double,但无论如何还是要感谢。请不要建议人们使用double
进行财务计算。始终使用decimal
。仅将变量类型更改为double
不会更改结果值-它仍将使用整数除法,但随后会将int
0转换为double
0。我必须将100设置为100.0,这将是一个double,但无论如何还是要感谢。请不要建议人们使用double
进行财务计算。始终使用decimal
。谢谢!我真的很感激。请不要建议人们使用double
进行财务计算。始终使用decimal
。@EricLippert好的一点-我已经修改了我的答案,以返回一个decimal
。它们之间的区别是什么?double
可能会有舍入错误,因为许多浮点数(如0.1)不能以二进制形式精确表示decimal
使用不同的存储机制,因此它可以