2016-10-20 45 views
1

我有一個float屬性,並且我遇到了精度問題。如果保存「745.34」這樣的值,它會正確保存到數據庫。但是,如果我嘗試保存4564523.845,例如,它會保存4564520.0。猜猜這不是一個數字,大浮動不支持它。我的控制檯的一些例子:Rails - Float precision

c.valor_total = 4564523.845 
=> 4564523.845 
2.3.1 :034 > c.save 
    (0.3ms) BEGIN 
    UnidadeConsumidora Load (0.3ms) SELECT `unidade_consumidoras`.* FROM `unidade_consumidoras` WHERE `unidade_consumidoras`.`id` = 28 LIMIT 1 
    SQL (21.2ms) UPDATE `contas` SET `valor_total` = 4564523.845, `updated_at` = '2016-10-20 17:28:20' WHERE `contas`.`id` = 28 
    (70.4ms) COMMIT 
=> true 
2.3.1 :035 > c = Conta.find 28 
    Conta Load (0.9ms) SELECT `contas`.* FROM `contas` WHERE `contas`.`id` = 28 LIMIT 1 
=> #<Conta id: 28, unidade_consumidora_id: 28, razao_social: "DROGARIA ARAUJO S A", ano: 2016, mes: 8, numero_cliente: "7000042467", cnpj: "17.256.512/0001-16", consumo_kwh: "10942", vencimento: "2016-10-18", valor_total: 4564520.0, created_at: "2016-10-19 18:43:35", updated_at: "2016-10-20 17:28:20", pdf_conta: "ADOLPHO_COTTA.pdf", unidade_de_leitura: "07020129", cod_instalacao: "3000728720", logradouro: "PCA ALEXANDRE LANZA 141 CO .", bairro: "CENTRO", cep: "35700-040", municipio: "SETE LAGOAS", uf: "MG"> 
2.3.1 :036 > c.valor_total 
=> 4564520.0 

看到更新的SQL日誌上的值是正確的......那麼它是什麼以及我如何解決它?

編輯:

schema.rb爲contas:

create_table "contas", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| 
    t.integer "unidade_consumidora_id" 
    t.string "razao_social" 
    t.integer "ano" 
    t.integer "mes" 
    t.string "numero_cliente" 
    t.string "cnpj" 
    t.string "consumo_kwh" 
    t.date  "vencimento" 
    t.float "valor_total",   limit: 24 
    t.datetime "created_at",      null: false 
    t.datetime "updated_at",      null: false 
    t.string "pdf_conta" 
    t.string "unidade_de_leitura" 
    t.string "cod_instalacao" 
    t.string "logradouro" 
    t.string "bairro" 
    t.string "cep" 
    t.string "municipio" 
    t.string "uf" 
    t.index ["unidade_consumidora_id"], name: "index_contas_on_unidade_consumidora_id", using: :btree 
    end 
+1

您是否介意發佈'contas'表的SQL定義?或者至少定義了'valor_total'的重要部分。 – fanta

+0

@fanta發佈一個編輯schema.rb ...看看它是否有幫助!謝謝 –

+0

Andrey給了你答案,你需要在你的定義中包含'precision'和'scale'。 – fanta

回答

2

我敢肯定,你只是有 「錯誤」 的數據庫類型存在。如果你的目標是存儲精確的數字,你想要的是decimal

我建議你改變數據類型:

change_column :contas, :valor_total, :decimal, precision: 5, scale: 2 

編輯

您已經使用float數據類型,但是沒有指定精度。儘管你可能(從來沒有看到使用db類型的float)可以改變它並指定它,但我仍然建議使用decimal來處理這樣的事情,因爲它在計算時不會做任何事情,所以你總會有你可以得到最精確的數字。

+0

這正是發生了什麼!像魅力一樣工作......非常感謝! –

+0

@RananLopes也一定要檢查什麼樣的認真和規模,爲自己挑選合適的 –

+1

這樣做,15精度對我來說工作正常。謝謝! –