30

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

4

9 回答 9

62

尝试使用模法:

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
于 2012-09-13T12:21:35.973 回答
12

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

number = 1.23
parts = number.to_s.split(".")
result = parts.count > 1 ? parts[1].to_s : 0
于 2012-09-13T12:21:48.743 回答
9
n = 1.23

n.modulo(1)
=> 0.22999999999999998

n - n.to_i
=> 0.22999999999999998

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

于 2012-09-13T12:21:02.353 回答
6

如果你知道你想要的精度,这可能比 to_s 解决方案快一点。

1.1234.modulo(1).round(4) #0.1234
于 2015-04-30T16:35:42.470 回答
5

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

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

decimal = BigDecimal.new("1.23")
decimal.frac #=> 0.23
于 2015-11-13T01:16:38.740 回答
2

...“1.23”,我想得到“23”。

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

((number - number.to_i) * 100).to_i
于 2018-09-12T13:36:00.000 回答
1
 a=1.23 #value of a will be 1.23
 a=a-a.to_i #value of a will be 0.23
于 2014-12-29T06:15:56.843 回答
0

在尝试了一切之后......我觉得最好的答案是(num - num.to_i).abs因为它也适用于负数。

例如

(1.23 - 1.23.to_i).abs = 0.23

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

于 2016-02-25T03:46:08.227 回答
0

我们可以通过多种方式实现输出modulo是其中之一

1.23.modulo(1) => 0.22999999999999998

您可以根据自己的方便对结果进行四舍五入

但要实现您在问题中提出的要求

我将遵循一个非常简单的方法

value = 1.23.to_s.split('.') -> ["1", "23"]
value.last.to_i -> "23"
于 2020-04-26T06:28:24.637 回答