【问题标题】:A simple C# Statement works unexpected一个简单的 C# 语句出人意料
【发布时间】:2014-01-06 19:49:44
【问题描述】:

我有这行代码:

int WStoneCost = PriceMethod.StoneCost / 100 * AP;

而 PriceMethod.StoneCost 等于 25 而 AP 等于 70。 我已经使用断点对其进行了检查,但我不明白为什么在运行此行后会得到零。 (WStoneCost 等于零) 它只是一个错误的符号还是我做错了什么?提前致谢。 最后如何获得正确的双倍?喜欢 17。5

【问题讨论】:

  • 也许你的一些变量是整数而不是浮点数。 (int)(25 / 100) 等于 0。
  • @JonathanWood:我会说有 100% 的机会。
  • 都是整数。抱歉,我是新手。
  • @paqogomez 不,*/ 运算符是从左到右应用的,所以它相当于 (25/100) * 70
  • @paqogomez - 它真的优先于乘除吗?当我运行这行代码时:double WStoneCost = 25.0 / 100.0 * 70; 结果是 17.5。我的理解是乘法和除法具有相同的优先级,因此按照它们从左到右出现的顺序执行。 (D Stanley 打败了我!)。

标签: c# line division multiplication


【解决方案1】:

您正在进行整数除法,所以25/1000,而不是0.25,因此0 * 700。由于您的结果变量也是int,因此不清楚您期望什么结果,但您可以重新排序操作以获得非零答案:

int WStoneCost = (PriceMethod.StoneCost * AP)/ 100 ;

它仍然是整数除法,但您的输入会将 25*70 (1,750) 除以 100,得到 17。

如果你想要 floating-point 十进制结果,只需使用 100m:

decimal WStoneCost = (PriceMethod.StoneCost * AP)/ 100m ;

由于文字 100mdecimal,那么编译器将使用 floating-point 十进制除法,这将为您提供 decimal 结果。

【讨论】:

  • 谢谢!我真的很感激。
  • 从不建议人们使用double 进行财务计算。始终使用decimal
  • @EricLippert 好点 - 我已经修改了我的答案,改为返回 decimal
  • 它们有什么区别?
  • double 可能存在舍入错误,因为许多浮点数(如 0.1)不能准确地以二进制形式表示。 decimal 使用了不同的存储机制,因此它可以准确地表示 0.1,因此计算更准确。
【解决方案2】:

最后如何获得正确的双精度数?喜欢 17.5

你的问题和到目前为止给出的两个答案都表明你们三个人都想做一些危险的错误。 您正在进行财务计算,因此您应该始终使用 decimal,而不是 double double 用于物理计算,而不是财务 计算。

【讨论】:

  • 除非您需要执行诸如幂、平方根或对数之类的“奇异”运算,否则您可能不得不转换回 double,因为 .NET 没有小数重载通过这些操作。我认为说“总是”太强了。为正确的工作使用正确的工具。
  • @MgSam:当然;但是如果你在做一个平方根,那么你的计算首先不需要在十进制中出现零错误的可能性很大。
【解决方案3】:

我同意乔纳森伍德的观点。根据您提供的值,您的答案将产生一个小数。因此,您需要 WStoneCost 为 double 或 float。此外,您可能希望在方程式中使用括号,以确保按照您的预期执行运算顺序。

希望这会有所帮助!

-吟游诗人加里

【讨论】:

  • 仅将变量类型更改为double 不会更改结果值 - 它仍会使用整数除法,但会将int 0 转换为double 0。
  • 我不得不将 100 设置为 100.0 以使其成为双倍,但无论如何谢谢。
  • 从不建议人们使用double 进行财务计算。始终使用decimal
猜你喜欢
  • 2018-06-09
  • 1970-01-01
  • 2011-10-18
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
相关资源
最近更新 更多