Функция Ruby .round () округляет значения, но сохраняет исходное значение только в базе данных. - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь округлить суммы, которые я получаю, до 2 десятичных знаков. У меня есть атрибут количества в виде десятичного поля с точностью 32 и шкалой 16.

Я пробовал делать количество. Около (2)

def amount(amt)
  amt.to_f.round(2)
end

Допустим, amt = 80500.00999999999. При печати этого в журналах рельсов, я получаю 80500.01. Но при сохранении сохраняет 80500.00999999999 в базе данных. Также я заметил, что если я делаю 65535.00999 (или меньшие значения), его округление и сохранение правильно до 65535.01. С другой стороны, если я использую amount= 65536.00999 (или большее значение), он сохраняет сумму в базе данных без округления. Я взял эти цифры, в частности, поскольку 65535 является верхним пределом без знака smallInt в Postgres, и каким-то образом получаю эти результаты.

EDIT:

У меня есть модель транзакции, которая имеет атрибут под названием сумма. У меня есть другой файл:

# app/operations/txn.rb

def create_txn
  @transaction = Transaction.new(transaction_params)
  @transaction.save
end

def transaction_params
{
  .
  .
  .
  amount: dest_amount,
  .
  .
  .
}
end

def dest_amount
  #logic
end

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Я предлагаю вам установить следующий метод установки как метод экземпляра для атрибута db amount внутри модели,

def amount=(amt)
  super(amt.to_f.round(2))
end

Это сохранит обновленное значение суммы в вашей базе данных в соответствии с вашими потребностями.

0 голосов
/ 03 июня 2019

Обычный метод решения проблем , связанных с числами с плавающей запятой - хранить центы как целые числа, а не доллары как числа с плавающей запятой.

Вы рассчитываете и храните все как центы, и вам нужно только конвертироватьв долларах для демонстрации, путем деления на 100.0.

...