C#Windows程序以十亿分之一的价值计算

时间:2017-10-07 10:45:42

标签: c#

我在按钮点击事件中有这样的源代码:

int a = 0; decimal b = 0;
a = 1000;
b = 3000 + (a - 2) * 1000;
txtSummary.Text = b.ToString("N0");

我在这样的变量中测试一些值:

  • 1,000结果1,001,000
  • 10,000结果10,001,000
  • 100,000结果100,001,000
  • 1,000,000结果1,000,001,000
  • 10,000,000结果1,410,066,408(错误)。正确的是10,000,001,000

我的代码有什么问题?程序在.NET Framework 3.5中创建。 Visual Studio 2015.Windows 10 x64。

2 个答案:

答案 0 :(得分:5)

你进行整数乘法,之后将其转换为小数(即你正在处理整数溢出)。

比率:3000 + (a - 2) * 1000; - > 3000是一个int,a是一个int,2是一个int,1000是一个int。因此,a-2将给出一个int,(a - 2) * 1000也会产生一个int,并且(guess ...)3000 + (a - 2) * 1000是一个int。赋值最终转换为小数。不是你的期望,对吗? : - )

解决方案:将组件(a就足够了)转换为小数 first ,然后进行计算。

答案 1 :(得分:4)

作为最大int value is 2,147,483,647,值会溢出并“包裹”。它甚至做了好几次。

潜在的解决方案:

  • 使用decimal代替变量a代替int
  • 通过在溢出或通过强制转换的操作中附加decimal,将至少一个用于m的数字投射到其中。

示例:

b = 3000 + (a - 2m) * 1000;

b = 3000 + (a - 2) * 1000m;

b = 3000 + ((decimal) a - 2) * 1000;