得到十进制数的小数部分

yag*_*sun 24 ruby ruby-on-rails ruby-on-rails-3

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

小智 51

尝试使用modulo方法:

1.23.modulo(1) => 0.23
Run Code Online (Sandbox Code Playgroud)

点击此处了解更多信息:http://www.ruby-doc.org/core-1.9.3/Numeric.html#method-i-modulo

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

1.23 - 1.23.to_i => 0.23
Run Code Online (Sandbox Code Playgroud)

  • 我得到`(1.1).modulo(1)#0.10000000000000009`这是不可接受的! (3认同)
  • @迷宫我正在使用n.modulo(1).round(2) (2认同)

小智 9

我不确定这是否是最简单的方法 - 但您可以使用"."简单地拆分数字.字符 - 像这样:

number = 1.23
parts = number.to_s.split(".")
result = parts.count > 1 ? parts[1].to_s : 0
Run Code Online (Sandbox Code Playgroud)

  • 未来的读者,请不要使用这种方法.它可能在一个简单的情况下工作,但会在任何区域设置感知的情况下跳闸.虽然在Ruby中硬编码"."作为浮点分隔符不是非常容易出错,但它会增加与其他不太宽容的语言一起使用的坏习惯.请使用数学函数进行数学运算,请参阅下面的答案. (3认同)

Jon*_*röm 8

n = 1.23

n.modulo(1)
=> 0.22999999999999998

n - n.to_i
=> 0.22999999999999998
Run Code Online (Sandbox Code Playgroud)

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


bio*_*ffe 6

如果您知道所需的精度,这对于 to_s 解决方案可能会快一点。

1.1234.modulo(1).round(4) #0.1234
Run Code Online (Sandbox Code Playgroud)


blo*_*ilk 5

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

如果不能接受浮点错误,请不要使用Float!Ruby附带了一个很棒的BigDecimal类,它以性能为代价更加准确,语法也有些冗长。

decimal = BigDecimal.new("1.23")
decimal.frac #=> 0.23
Run Code Online (Sandbox Code Playgroud)