Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将999999999999999999.001转换为;999999999999999999.001;红宝石色_Ruby - Fatal编程技术网

Ruby 将999999999999999999.001转换为;999999999999999999.001;红宝石色

Ruby 将999999999999999999.001转换为;999999999999999999.001;红宝石色,ruby,Ruby,如何在ruby中将99999999999999999999999.001转换为“99999999999999999999999.001” 我试过了 >> 9999999999999999999999.001.to_s => "1.0e+22" >> "%f" % 9999999999999999999999.001 => "10000000000000000000000.000000" 事实是你不能。你写的数字是22位,而ruby中的浮点数只有15位精度。

如何在ruby中将99999999999999999999999.001转换为“99999999999999999999999.001”

我试过了

>> 9999999999999999999999.001.to_s
=> "1.0e+22"

>> "%f" % 9999999999999999999999.001
=> "10000000000000000000000.000000"

事实是你不能。你写的数字是22位,而ruby中的浮点数只有15位精度。因此,当您使用这个变量时,它的一部分值就有点“丢失”,因为它属于Float类。

使用标准库中的
BigDecimal

1.8.7 :005 > require 'bigdecimal'
 => true 
1.8.7 :006 > BigDecimal('9999999999999999999999.001')
 => #<BigDecimal:7fe0cbcead70,'0.9999999999 9999999999 99001E22',36(36)> 
1.8.7 :007 > BigDecimal('9999999999999999999999.001').to_s
 => "0.9999999999999999999999001E22"
1.8.7:005>要求使用“bigdecimal”
=>正确
1.8.7:006>大十进制('999999999999999.001')
=> # 
1.8.7:007>大十进制('99999999999999999.001')。至
=>“0.999999999999999999001E22”

当然,这个例子只表明BigDecimal可以处理这么大的数字。无论您最初从何处获取
999999999999999999.001
数字,都需要在计算/输入后立即将其输入
bigdecimic

您不能这样做。原因很简单:从一开始,数字的值就不是精确的
999999999999999999001
。浮点数的精度只有15位

但是,您可以使用其他类型来实现您想要的:

require 'bigdecimal'
a = BigDecimal("9999999999999999999999.001")
a.to_s("F")
>> "9999999999999999999999.001"
对于
BigDecimal
而言,精度随更大实数的请求而扩展-不受任何限制

浮点运算速度更快,因为它意味着直接使用处理器的FPU,但正因为如此,精度受到限制

编辑特别是对于@izomorphius和他的论点,只是一个非常简短的代码示例:

a = "34.101"
b = BigDecimal(a.to_s)
c = b ** 15
c.to_s("F")
>>> 98063348952510709441484.183684987951811295085234607613193907150561501

现在告诉我如何获取最后一个字符串?

您确定文本
99999999999999999999.001
实际上是
999999999999999
?这些数字看起来比
double
所能代表的更重要。因此,如果ruby对其数字使用
double
,这就行不通了。因此,我怀疑转换为字符串会导致这些问题。您意识到您使用字符串
99999999999999999.001
来获取字符串
999999999999999001
Op有兴趣将值转换为字符串,如果您已经有字符串来初始化BigDecimal,他一开始就不会有这个问题。