【问题标题】:C# Bug or Something Wrong [duplicate]C#错误或错误[重复]
【发布时间】:2014-11-30 18:19:15
【问题描述】:

我遇到了一个问题,C# 无法正确计算以绘制进度条。

int width = 130;
int maxValue = 20;
int value = 20;

int percent = (width / maxValue) * value

现在它应该返回 130,这意味着我的进度条已满,但它返回 120,所以我不知道发生了什么。

这是进度条的图片http://imgur.com/sUbshxk

我还用 VB.NET 测试了这个公式,效果很好。

我在 Windows 7 x86 中使用 VS2013。

【问题讨论】:

  • C# 错误?供将来参考...它绝不是 C# 编译器中的错误。
  • 始终是编译器错误,绝不是“程序员”。
  • 如果你不想开始投射,你可以改变你的公式:percent = (width * value) / maxValue

标签: c# vb.net percentage division


【解决方案1】:

130 / 20 执行integer divison

来自/ Operator (C# Reference)

当你将两个整数相除时,结果总是一个整数。为了 例如,7 / 3 的结果是 2

这就是为什么它总是丢弃小数部分并返回6。这就是为什么您的结果将是 6 * 20 等于 120

作为一种解决方案,您可以将 整数除法 更改为 浮点除法

例如;

var percent = (130.0 / 20) * 20;
var percent = (130 / 20.0) * 20;

这意味着,您需要将其中一个变量定义为 double,或在计算中将其中一个变量转换为 double

【讨论】:

  • @Downvoter 至少愿意发表评论,这样我就可以知道我可能错在哪里?
  • 看起来这个问题中的每个答案都被否决了。也许是连续投票者?
  • @ChrisDunaway 是的,闻起来像..
【解决方案2】:

您需要将值转换为双精度:

int percent = (int)(((double)width / (double)maxValue) * (double)value);

130 / 20 = 6.5 并且它将被隐式转换为 integer 这使得 6 成为它。所以下面的乘法使用了错误的值

【讨论】:

  • 或者首先使用双打。
【解决方案3】:

由于您正在划分两个int 变量,因此您正在执行整数除法。 130/20 是 6.5,在整数上下文中被截断为 6。然后乘以 20,得到 120 的结果。

您可以通过将变量定义为doubles 来完全避免此问题:

double width = 130;
double maxValue = 20;
double value = 20;

double percent = (width / maxValue) * value;

【讨论】:

    【解决方案4】:

    在大多数编程语言中,整数除以整数总是得到整数。

    如果您不想要整数结果,请确保至少有一个操作数是浮点数或双精度数:

    int width = 130;
    float maxValue = 20.0;
    int value = 20;
    
    int percent = (width / maxValue) * value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2014-08-28
      相关资源
      最近更新 更多