得到十进制数的小数部分

时间:2012-09-13 12:16:05

标签: ruby-on-rails ruby ruby-on-rails-3

我想在rails中获得十进制数的一小部分。例如,我有一个数字,“1.23”,我想得到“23”这可能太容易但是,有没有人知道我该怎么办?

9 个答案:

答案 0 :(得分:49)

尝试使用modulo方法:

1.23.modulo(1) => 0.23

在此处阅读更多内容:http://www.ruby-doc.org/core-1.9.3/Numeric.html#method-i-modulo

或者您可以将float转换为整数并从原始浮点值中减去它。

1.23 - 1.23.to_i => 0.23

答案 1 :(得分:9)

我不确定这是否是最简单的方法 - 但您可以使用“。”简单地分割数字。人物 - 像这样:

number = 1.23
parts = number.to_s.split(".")
result = parts.count > 1 ? parts[1].to_s : 0

答案 2 :(得分:8)

n = 1.23

n.modulo(1)
=> 0.22999999999999998

n - n.to_i
=> 0.22999999999999998

推荐阅读http://floating-point-gui.de/

答案 3 :(得分:4)

确定正确的解决方案需要了解您正在使用的类型。如果您的值是Float(Ruby中非整数的标准类型),则mod(1)之类的逻辑正确答案可能会因floating point errors而产生意外结果。对于Float是首先使用的正确数据类型的任何情况,这都是可以接受的。

如果浮点错误可接受,请不要使用Float! Ruby提供了很棒的BigDecimal类,它以性能为代价而且更加冗长,语法更加精确。

decimal = BigDecimal.new("1.23")
decimal.frac #=> 0.23

答案 4 :(得分:3)

如果您知道所需的精度,那么to_s解决方案可能会更快一些。

1.1234.modulo(1).round(4) #0.1234

答案 5 :(得分:1)

 a=1.23 #value of a will be 1.23
 a=a-a.to_i #value of a will be 0.23

答案 6 :(得分:0)

尝试了所有内容后......我觉得最好的答案是(num - num.to_i).abs,因为它也适用于负数。

e.g。

(1.23 - 1.23.to_i).abs = 0.23

( - 1.23 - -1.23.to_i).abs = 0.23

答案 7 :(得分:0)

  

...“ 1.23”,我想输入“ 23”。

只需除去整数部分并乘以100。

((number - number.to_i) * 100).to_i

答案 8 :(得分:0)

我们可以通过多种方法来实现输出modulo是其中的一种

1.23.modulo(1) => 0.22999999999999998

您可以根据需要四舍五入结果

但要实现您所提出的问题

我将采用一种非常简单的方法

value = 1.23.to_s.split('.') -> ["1", "23"]
value.last.to_i -> "23"