我怎样才能得到5或10的下一个最大倍数

发布于 2024-12-17 10:35:36 字数 405 浏览 1 评论 0原文

从给定的 double 我想根据一些规则获得下一个最高的数字,由于我在描述它们时遇到一些困难,我将通过示例进行说明:

Input      Desired output
-------    --------------
   0.08         0.1
   0.2          0.5
   5           10
   7           10
  99          100
 100          500
2345         5000

输出在某种意义上应该是“下一个最高的数字” 5或10'的倍数。

我希望这是可以理解的;如果没有,请告诉我。

该实现将在 java 中进行,输入将为正double

From a given double I want to get the next highest number according to some rules which, since I have some difficulty describing them, I will illustrate by examples:

Input      Desired output
-------    --------------
   0.08         0.1
   0.2          0.5
   5           10
   7           10
  99          100
 100          500
2345         5000

The output should be in some sense the 'next highest multiple of 5 or 10'.

I hope this is understandable; if not, let me know.

The implementation will be in java and input will be positive doubles.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

荒芜了季节 2024-12-24 10:35:36
function top5_10 (x) {
  var ten = Math.pow(10, Math.ceiling(Math.ln(x)/Math.LN10)));
  if (ten > 10 * x) { ten = ten / 10; }
  else if (ten <= x) { ten = 10 * ten; }
  return x < ten / 2 ? ten / 2 : ten;
}

或类似的东西:-)

function top5_10 (x) {
  var ten = Math.pow(10, Math.ceiling(Math.ln(x)/Math.LN10)));
  if (ten > 10 * x) { ten = ten / 10; }
  else if (ten <= x) { ten = 10 * ten; }
  return x < ten / 2 ? ten / 2 : ten;
}

or something like this :-)

混吃等死 2024-12-24 10:35:36

这是一个适用于示例数据的函数:

def f(x):
    lx = log10(x)
    e = floor(lx)
    if (lx - e) < log10(5):
        return 5 * 10 ** e
    else:
        return 10 ** (e+1)

Here's a function that works on the sample data:

def f(x):
    lx = log10(x)
    e = floor(lx)
    if (lx - e) < log10(5):
        return 5 * 10 ** e
    else:
        return 10 ** (e+1)
流心雨 2024-12-24 10:35:36

伪代码应该是这样的:

If number > 1
    n = 1
    While(true)
        If(number < n)
            return n
        If(number < n*5)
            return n*5
        n = n*10
Else
    n = 1.0
    While(true)
        If(number > n/2)
            return n
        If(number > n/10)
            return n*2
        n = n/10.0

对于数字> 1、这样检查:
如果< 5, 5. 如果<10, 10, 如果<10 50、50。
对于数字< 1、这样检查:
如果> 0.5 1.如果> 0.1、0.5。 ETC。

Pseudo code should be something like this:

If number > 1
    n = 1
    While(true)
        If(number < n)
            return n
        If(number < n*5)
            return n*5
        n = n*10
Else
    n = 1.0
    While(true)
        If(number > n/2)
            return n
        If(number > n/10)
            return n*2
        n = n/10.0

For numbers > 1, it checks like this:
if < 5, 5. if <10, 10, if < 50, 50.
For numbers < 1, it checks like this:
if > 0.5 1. if > 0.1, 0.5. etc.

愁杀 2024-12-24 10:35:36

如果您打算使用双精度数并需要精确的结果,则所有使用双精度乘法/除法/log10 的方法都不起作用(或者至少难以实现和证明正确性)。多精度算术在这里可能会有所帮助。或者使用这样的搜索:

powers = [1.e-309, 1.e-308, ..., 1.e309]
p = search_first_greater(powers, number)
if (number < p / 2.) return p / 2.
return p

search_first_greater 可以实现为:

  • 线性搜索,
  • 或二分搜索,
  • 或通过 n=round(log10(number)) 直接计算数组索引并仅检查幂[n-1 .. n]
  • 或使用对数近似,例如从数字中删除指数部分并检查 powers[] 的 4 个元素。

If you intend to use doubles and need precise result, all methods using double-precision multiply/divide/log10 are not working (or at least are hard to implement and prove correctness). Multi-precision arithmetic might help here. Or use search like this:

powers = [1.e-309, 1.e-308, ..., 1.e309]
p = search_first_greater(powers, number)
if (number < p / 2.) return p / 2.
return p

search_first_greater may be implemented as:

  • linear search,
  • or binary search,
  • or direct calculation of the array index by n=round(log10(number)) and checking only powers[n-1 .. n]
  • or using logarithm approximation like cutting the exponent part out of the number and checking 4 elements of powers[].
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文