【问题标题】:Round a number to the next HIGHEST 10将数字四舍五入到下一个 HIGHEST 10
【发布时间】:2011-12-30 13:02:23
【问题描述】:

我需要创建一个图表,其中 Y 轴的比例会根据输入到系统的数据而变化。可以想象,这个尺度可能是 0-10、0-100 之间的任意一个,甚至有下限数千,上限为百万。

要正确确定此轴的比例,我需要计算点与像素的比率(基于图形高度/范围)。 现在,图表的轴永远不会从最低值开始到最高值,通常的做法是根据值的范围转到下一个最接近的 2、5 或 10(高于上限,低于下限)。

所以我想知道的是如何从数据集中取最大值,并将其四舍五入到最接近的 10。 为澄清起见,输入值将始终为整数。

我现在拥有的是这个

        if ((rangeMax < 10) && (rangeMax > 5))
            rangeMax = 10;
        else if (rangeMax < 5)
            rangeMax = 5;

这仅对小于 10 的值有用,并且不允许真正动态所需的灵活性。最终,此图表将在页面加载事件期间自动生成,无需用户输入。

我已经阅读了一些内容,人们谈论模数运算符 (%) 之类的东西,但我找不到任何关于它的使用的可靠信息,以及关于 Math.Ceiling 和 Math.Round 的讨论,但是这些转到下一个最接近的整数,它并不完全存在,并且在处理整数时似乎根本没有多大帮助。 非常感谢任何建议、指示或帮助。

我确实在这里找到了类似的问题How can i get the next highest multiple of 5 or 10,但我不懂 java,所以我无法理解所说的任何内容。

干杯

【问题讨论】:

  • 只有正整数还是负整数?如果也是负数,它们应该向零舍入还是向负无穷大?
  • 好吧,如果您使用 C# 编写代码,那么了解 Java 并不是必需的。但是,要将 INTEGER 舍入到下一个 5 的倍数,就像您使用代码 sn-p 描述它的方式一样,您需要加 4,除以 5,然后乘以 5。
  • @harold 在当前范围内,只是正面的,但如果这可行,那么该概念将在系统的其他地方使用

标签: c# numbers rounding


【解决方案1】:
if(rangeMax % 10 !=0)
   rangeMax = (rangeMax - rangeMax % 10) + 10;

您还可以将Math.Round()MidpointRounding.AwayFromZero 一起使用十进制数(否则整数除法会截断分数):

decimal number = 55M;
decimal nextHighest = Math.Round(number/ 10, MidpointRounding.AwayFromZero) * 10;

【讨论】:

  • 干杯,MidpointRounding 方法似乎有效,至少它适用于我的小而温和的测试数据集。但我不太清楚你的第一种方法是做什么的,或者它是如何工作的,我的测试数据总是直接跳过它
  • 没关系,我已经用各种测试数据集检查了几次,我想我知道它是如何工作的。为答案喝彩,我们有赢家
  • 警告:这仅在您想四舍五入到 10 的倍数时才有效。考虑值 2671.875 和步长 50。我希望舍入值 2700。2671.875/50 = 53.4375,四舍五入为 53 . 但是 53x50 = 2650。
【解决方案2】:

如果要升到下10,可以使用Math.Ceiling,如下:

rangeMax = (int)(Math.Ceiling((decimal)rangeMax / 10) * 10);

如果你需要泛化到下一个n(例如这里的5)你可以这样做:

int n = 5;    
rangeMax = (int)(Math.Ceiling((decimal)rangeMax / n) * n);

【讨论】:

  • ceil 没有这样做 - 这是一个很好的截断整数除法。
  • @harold:没错! - 并且截断应该足够了。
  • 是的,向下取整..(或者更确切地说,趋近于零)
  • 这可能在刻度的底端更有用,因为它需要向下舍入,远离 rangeMin 值。反正我就是这么计划的。虽然欢呼
  • @Archaon6044:更新后的代码将根据需要进行四舍五入。要四舍五入,您可以将代码从 Math.Ceiling 更改为 Math.Floor
【解决方案3】:

可能有帮助的方法是将数字除以 10。这应该将其四舍五入到最接近的整数。然后再乘以 10,将数字四舍五入到最接近的 10

【讨论】:

    【解决方案4】:

    我用这个:

    public static double RoundTo10(double number)
            {
                if (number > 0)
                {
                    return Math.Ceiling(number / 10) * 10;
                }
                else
                {
                    return Math.Floor(number / 10) * 10;
                }
            }
    

    【讨论】:

      【解决方案5】:

      你可以试试这个……

                  decimal val = 95;
              //decimal val =Convert.ToDecimal( textBox1.Text);
              decimal tmp = 0;
              tmp = (val % 10);
              //MessageBox.Show(tmp.ToString()+ "Final val:"+(val-tmp).ToString());
              decimal finval = val - tmp;
      

      【讨论】:

      • 您的代码四舍五入到最接近的 10,而不是下一个 HIGHEST 10
      猜你喜欢
      • 1970-01-01
      • 2018-12-31
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多