【问题标题】:NumericUpDown Value turns to 0 when it is set as a floatNumericUpDown 值设置为浮点数时变为 0
【发布时间】:2012-05-17 21:31:28
【问题描述】:

所以 resizeWidth 和 resizeHeight 是以下代码中的 numericUpDown 控件。 此外,tempBitmapW 和 tempBitmapH 都是浮点数。

float rW = (float)resizeWidth.Value;
float rH = (float)resizeHeight.Value;
rH = (float)Math.Truncate(tempBitmapH * ((float)rW / tempBitmapW));
int rsW = (int)rW;
int rsH = (int)rH;
resizeWidth.Value = rsW;
resizeHeight.Value = rsH;

现在,当我调试它时,rsW 和 rsH 以及 rW 和 rH 不会读为 0,它们都没有。 但由于某种原因,numericUpDown 控件会抛出错误,因为值 0 超出了最小值/最大值范围(最小值设置为 1),因此基本上它会将其读取为 0。

我做错了什么?

【问题讨论】:

  • tempBitmapH、resizeWidth.Value和resizeHeight.Value的原始值是多少?
  • 你确定 rsW 和 rsH 大于 0 吗?这不是正常行为。

标签: c# floating-point int numeric


【解决方案1】:

您只是没有正确理解演员表的工作原理。 由于您将浮点数转换为 int 的方式,您将得到 0。浮点值可能是 0.42,但它会以整数形式转换为 0。

您应该详细检查演员表的工作原理,这可能会解决您的问题。

【讨论】:

  • 谢谢,但我发现了问题,我不确定你是否基本上是在说这个,但因为每次 numericUpDown 的值发生变化时都会发生这种情况,所以它只会在它发生时不断触发另一个最后改变它,所以它只是不断减少它直到它达到0。我现在已经解决了这个问题,所以它只在手动更改值时触发。
【解决方案2】:

扩展 squelos 的答案 - 听起来您在调试器中查看值的时刻和抛出异常的时刻可能是两个不同的时刻。如果您收到异常说值为零 - 可能是因为值为零。

它可能变为零的原因是因为从 float 到 int 的强制转换总是向下舍入到最接近的整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多