如何在 Ruby On Rails 中将数字舍入为动态精度?

发布于 2024-07-21 14:36:11 字数 332 浏览 6 评论 0原文

我想将数字四舍五入到最接近的数量级。 (我想我说得对)

这里有一些例子:

Input => Output

8 => 10
34 => 40
99 => 100
120 => 200
360 => 400
990 => 1000
1040 => 2000
1620 => 2000
5070 => 6000
9000 => 10000

有人知道用 Ruby 或 Rails 编写的快速方法吗?

本质上我需要知道数字的数量级以及如何按该精度进行舍入。

谢谢!

I want to round numbers up to their nearest order of magnitude. (I think I said this right)

Here are some examples:

Input => Output

8 => 10
34 => 40
99 => 100
120 => 200
360 => 400
990 => 1000
1040 => 2000
1620 => 2000
5070 => 6000
9000 => 10000

Anyone know a quick way to write that in Ruby or Rails?

Essentially I need to know the order of magnitude of the number and how to round by that precision.

Thanks!

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

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

发布评论

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

评论(2

且行且努力 2024-07-28 14:36:11

这是另一种方式:

def roundup(num)
  x = Math.log10(num).floor
  num=(num/(10.0**x)).ceil*10**x
  return num
end

更惯用的是:

def roundup(num)
  x = Math.log10(num).floor
  (num/(10.0**x)).ceil * 10**x
end

Here's another way:

def roundup(num)
  x = Math.log10(num).floor
  num=(num/(10.0**x)).ceil*10**x
  return num
end

More idiomatically:

def roundup(num)
  x = Math.log10(num).floor
  (num/(10.0**x)).ceil * 10**x
end
能怎样 2024-07-28 14:36:11

这是一个解决方案。 它实现以下规则:

  • 0 和 10 的幂不被修改;
  • 9??? 四舍五入到 10000(无论多长时间);
  • A??? 向上舍入为 B000(无论多长),其中 B 是 A 后面的数字

。 .

def roundup(n)
  n = n.to_i
  s = n.to_s
  s =~ /\A1?0*\z/ ? n : s =~ /\A\d0*\z/ ? ("1" + "0" * s.size).to_i :     
      (s[0, 1].to_i + 1).to_s + "0" * (s.size - 1)).to_i
end

fail if roundup(0) != 0
fail if roundup(1) != 1
fail if roundup(8) != 10
fail if roundup(34) != 40
fail if roundup(99) != 100
fail if roundup(100) != 100
fail if roundup(120) != 200
fail if roundup(360) != 400
fail if roundup(990) != 1000
fail if roundup(1040) != 2000
fail if roundup(1620) != 2000
fail if roundup(5070) != 6000
fail if roundup(6000) != 10000
fail if roundup(9000) != 10000

Here is a solution. It implements the following rules:

  • 0 and powers of 10 are not modified;
  • 9??? is rounded up to 10000 (no matter how long);
  • A??? is rounded up to B000 (no matter how long), where B is the digit following A.

.

def roundup(n)
  n = n.to_i
  s = n.to_s
  s =~ /\A1?0*\z/ ? n : s =~ /\A\d0*\z/ ? ("1" + "0" * s.size).to_i :     
      (s[0, 1].to_i + 1).to_s + "0" * (s.size - 1)).to_i
end

fail if roundup(0) != 0
fail if roundup(1) != 1
fail if roundup(8) != 10
fail if roundup(34) != 40
fail if roundup(99) != 100
fail if roundup(100) != 100
fail if roundup(120) != 200
fail if roundup(360) != 400
fail if roundup(990) != 1000
fail if roundup(1040) != 2000
fail if roundup(1620) != 2000
fail if roundup(5070) != 6000
fail if roundup(6000) != 10000
fail if roundup(9000) != 10000
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文