我正在尝试在rails中获取十进制数的一小部分。例如,我有一个数字,即“1.23”,我想得到“23”。这可能太容易了,但是,有人知道我该怎么做吗?
9 回答
尝试使用模法:
1.23.modulo(1) => 0.23
在这里阅读更多:http ://www.ruby-doc.org/core-1.9.3/Numeric.html#method-i-modulo
或者您可以将浮点数转换为整数并从原始浮点值中减去它。
1.23 - 1.23.to_i => 0.23
我不确定这是否是最简单的方法 - 但您可以使用“。”简单地拆分数字。性格——像这样:
number = 1.23
parts = number.to_s.split(".")
result = parts.count > 1 ? parts[1].to_s : 0
n = 1.23
n.modulo(1)
=> 0.22999999999999998
n - n.to_i
=> 0.22999999999999998
如果你知道你想要的精度,这可能比 to_s 解决方案快一点。
1.1234.modulo(1).round(4) #0.1234
决定正确的解决方案需要了解您正在使用的类型。如果您的值是 Float(Ruby 中非整数的标准类型),那么逻辑上正确的答案mod(1)
可能会因浮点错误而产生意外结果。对于 Float 是首先要使用的正确数据类型的任何情况,这可能是可以接受的。
如果浮点错误是不可接受的,请不要使用Float
! Ruby 附带了一个很棒的BigDecimal
类,它以性能为代价更加准确,语法也更加冗长。
decimal = BigDecimal.new("1.23")
decimal.frac #=> 0.23
...“1.23”,我想得到“23”。
只需删除整数部分并乘以每 100。
((number - number.to_i) * 100).to_i
a=1.23 #value of a will be 1.23
a=a-a.to_i #value of a will be 0.23
在尝试了一切之后......我觉得最好的答案是(num - num.to_i).abs
因为它也适用于负数。
例如
(1.23 - 1.23.to_i).abs = 0.23
(-1.23 - -1.23.to_i).abs = 0.23
我们可以通过多种方式实现输出modulo
是其中之一
1.23.modulo(1) => 0.22999999999999998
您可以根据自己的方便对结果进行四舍五入
但要实现您在问题中提出的要求
我将遵循一个非常简单的方法
value = 1.23.to_s.split('.') -> ["1", "23"]
value.last.to_i -> "23"