Tag: 浮点

奇怪的舍入问题

使用小数和浮点数发生了一些非常奇怪的事情,我无法理解为什么或在哪里(ruby / rails / postgresql)。 给定带有小数列的购买表 – 总计 : p1 = Purchase.where(total: 5.99).first_or_create p2 = Purchase.where(total: 5.99).first_or_create [p1.id, p2.id] # => [1, 2] p3 = Purchase.where(total: 5.99.to_d).first_or_create p4 = Purchase.where(total: 5.99.to_d).first_or_create [p3.id, p4.id] # => [1, 1] 无论小数或浮点数,Ruby和postgresql都没有完全代表5.99的问题: 5.99.to_s # => “5.99” 5.99.to_d.to_s # => “5.99” 5.99 == 5.99.to_d # => true SELECT CAST(5.99 AS […]

奇怪的Heroku浮点精度错误(轨道上的ruby)

最初我模型上的一个坐标字段是使用整数,但当我尝试部署到Heroku时,我被提醒(通过崩溃)我需要它成为一个浮点(因为我的坐标中有小数点)。 所以我在我的本地机器上生成了change_column迁移,将change_column转换为浮动代替。 一切都很顺利。 我尝试再次部署到heroku,首先使用heroku pg:reset然后使用heroku db:setup 。 在db:setup期间,我收到以下错误: PGError: ERROR: precision for type float must be less than 54 bits : CREATE TABLE “landmarks” (“id” serial primary key, “name” character varying(255), “xcoord” float(255), “ycoord” float(255), “created_at” timestamp, “updated_at” timestamp) 所以我生成了另一个change_column迁移,这次使用:precision选项(设置为:precision => 50 ,小于54)。 我再次完成整个部署过程,它给了我同样的错误。 难道我做错了什么? 我在Heroku之前部署了另一个应用程序,之前使用了float而没有任何修改…… 我在我的本地机器上使用SQLite,我认为Heroku使用Postgres? 提前致谢! [编辑:我还应该提一下输出SQL后错误显示我改变了:precision我的coords的:precision值仍然说’浮动(255)’…不知道为什么]

Rails 3浮点或十进制表示GPS坐标

我需要将GPS坐标存储在数据库中。 我听说漂浮物不如小数精确。 真的吗? 如果是这样,有什么理由可以使用花车?

ruby计算浮动错误吗?

这有什么不对吗? (ruby版本:1.9.2p290(2011-07-09修订版32553)[x86_64-darwin11.0.0] x = 523.8 w = 46.9 xm = x + w assert_equal w, (xm – x) # FAILS with: expected but was

为什么这个表达式会导致浮点错误?

所以浮点运算是不精确的,但这并没有完全解释这里发生了什么: [46] pry(main)> a=0.05 => 0.05 [47] pry(main)> a=a*26.0/65 => 0.02 所以我们在这里得到了我们所期望的,我们得到了正确的答案,世界一直在变得美好。 但是我们后来重写了这个函数,当我们这样做时,我们交换a=a*26.0/65 a*=26.0/65不太好,我们输入的字符少一个! 让我们看看这对我们有何影响? [48] pry(main)> a=0.05 => 0.05 [49] pry(main)> a*=26.0/65 => 0.020000000000000004 [50] pry(main)> 26.0/65 => 0.4 它表明a*=b与写a=a*b 。 它似乎不是一个正常的浮点舍入误差,因为这些数字都不应该被舍入为浮点数(尾数应该足够长,每个26.0,26.0 / 65,65.0) 我确信引擎盖下有一些微妙的内容,想知道发生了什么?

Ruby中浮点的一致舍入

我理解由于浮点的不精确表示,下面的代码’感觉’不一致。 “%.1f” % 1.14 # => 1.1 “%.1f” % 1.15 # => 1.1 “%.1f” % 1.16 # => 1.2 “%.0f” % 1.4 # => 1 “%.0f” % 1.5 # => 2 “%.0f” % 1.6 # => 2 但是,有一种简单的方法可以将一致的浮点数舍入为5吗? 一种方法可能是明确地进行字符串操作。 是否有更简单的方法或现有的图书馆?

截断浮点数而不进行舍入

我有一个浮点数,我想截断到3个位置,但我不想舍入。 例如,将1.0155555555555555转换为1.015 (不是1.016 )。 我将如何在Ruby中执行此操作?

如何将浮点数舍入到Ruby中指定数量的有效数字?

在Ruby中拥有等效的R的signif函数会很不错。 例如: >> (11.11).signif(1) 10 >> (22.22).signif(2) 22 >> (3.333).signif(2) 3.3 >> (4.4).signif(3) 4.4 # It’s usually 4.40 but that’s OK. R does not print the trailing 0’s # because it returns the float data type. For Ruby we want the same. >> (5.55).signif(2) 5.6

圆形浮动的方法

浮动圆形向上或向下。 我总是需要它向下舍入。 我有解决方案,但我真的不喜欢它……也许有更好的方法。 这就是我要的: 1.9999.round_down(2) #=> 1.99 1.9901.round_down(2) #=> 1 我想出了这个解决方案,但我想知道是否有更好的解决方案(我不喜欢我转换浮动两次)。 有没有这方法? 因为我觉得很难找到它。 class Float def round_down(n=0) ((self * 10**n).to_i).to_f/10**n end end 谢谢。

将ruby浮动向上或向下滚动至最接近的0.05

我得到的数字就像 2.36363636363636 4.567563 1.234566465448465 10.5857447736 我如何让Ruby将这些数字向上(或向下)舍入到最接近的0.05?