【问题标题】:C# performant rounding that works across 0适用于 0 的 C# 高性能舍入
【发布时间】:2012-04-17 23:15:08
【问题描述】:
float x = 5;
Int16 x2 = (Int16)(x * 0.005);

x2 是 x 的截断/舍入版本。表示 200 个单元的块,如上代码所示。

但是上面的代码在 0 上产生了一个更大的区间。一个 400 而不是 200 的区间。

x     x2   intended
-500  -2   -3
-300  -1   -2
-100  0    -1
100   0    0
300   1    1
500   2    2

-210  -1   -2
-190  0    -1
-20   0    -1
-10   0    -1
10    0    0
20    0    0
190   0    0
210   1    1

解决这个问题的有效方法是什么?

【问题讨论】:

  • "在 0 上产生更大的区间"是什么意思?
  • 您希望看到 x2 的哪些数字?
  • 我现在已经包含了这些信息。
  • 如果您想要始终向下舍入的“下限”而不是向零舍入的截断,请调用恰当命名的 Floor 方法。

标签: c# performance integer rounding truncation


【解决方案1】:
float x = 5;
int16 x2 = (Int16)Math.Floor(x * 0.005);

Math.Floor描述:

返回小于或等于指定双精度浮点数的最大整数。

MSDN

【讨论】:

    【解决方案2】:

    很难确定,因为不清楚你想要完成什么,但我怀疑你想要的是Math.Floor。至少这适用于您的所有数据点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多