【问题标题】:How do I "round" a number to end in certain digits?如何“四舍五入”以某些数字结尾的数字?
【发布时间】:2010-01-06 10:36:52
【问题描述】:

我需要一个数学函数/公式/表达式来将数字作为参数并找到以大于参数的某些数字结尾的最小数字。

例如,如果结尾数字应该是 88,这些是我想要的一些示例:

f(0) = 0
f(87) = 88
f(88) = 88
f(89) = 188  //NB: NOT 88*2=176
f(187) = 188
f(188) = 188
f(189) = 288

等等。你明白了。

到目前为止,我已经使用了一个函数(在 Delphi 中,不是我实现的):

function RoundToSpecificEndingDigits(aLength,aModMeasure : double) : double;
begin
  Result := aModMeasure;
  while Result < aLength do Result := Result + 100;
end;

现在我需要一个更“数学”的方法来处理 div 和 mods 和 rounds 等。原因是我想在 SQL 中做它而不创建函数。

【问题讨论】:

  • @ck - 认为这个问题是关于 PHP 的,这里我们处理的是 Delphi 或 SQL(@Svein,你可能想澄清一下)。
  • @Dominic - 用 PHP 实现,但逻辑是通用的。
  • PHP 实现的问题(无论多么合乎逻辑)是它是一个 _algorithm:,而不是一个数学表达式。 nickf 的答案是一个数学表达式,因此满足了我的需求。

标签: math rounding


【解决方案1】:

这样的事情怎么样:

  1. 计算你想要四舍五入到“88”的位数=> n = 2
  2. 从您的号码中减去后缀。
  3. 四舍五入到最接近的 10^n(除以 10^n,四舍五入为整数,乘以 10^n)
  4. 添加后缀。

在 SQL 中:

SELECT
    CEIL(
        (num - suffix) / POW(10, LENGTH(suffix))
    ) * POW(10, LENGTH(suffix)) + suffix

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多