Разве использование float для денег не важно только для сайта электронной коммерции?

  • Автор темы TheeFuul
  • Обновлено
  • 17, May 2024
  • #1
Я все еще пишу сайт электронной коммерции.

Я использую Javascript, PHP и Golang.

Все три работают с деньгами, но не исключено, что это можно упростить.

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

Однако я не знаю, действительно ли это так важно только для сайта электронной коммерции.

Прямо сейчас я округляю суммы и использую для Javascript следующее:

var roundedTotal = Math.round(всего * 100) / 100

и для голанга:

SmallerTotalCostString := fmt.Sprintf("%.2f", TotalCostFloat)

Что касается php, то я не затевал этих денежных ситуаций, но на этом сайте видел вот это:

число_формат

деньги_формат

Что рекомендуется, чтобы все работало хорошо и все работало хорошо вместе.

Я думаю, что компьютер будет так же хорош, как кассовый аппарат! Может есть стандарты? Спасибо!

Изменить: я читал, что нужно использовать только центы, но все еще есть проблемы с умножением на десятичную дробь.

TheeFuul


Рег
24 Mar, 2013

Тем
69

Постов
220

Баллов
615
  • 18, May 2024
  • #2
«Ошибки округления заведут вас в тупик, поскольку два результата, которые ВЫГЛЯДЯТ одинаково, НЕ являются одинаковыми». Я не понимаю, как они выглядят одинаково, когда на самом деле это не так, Мерлинн?
 

Ybpxi3


Рег
04 Aug, 2015

Тем
70

Постов
208

Баллов
598
  • 21, May 2024
  • #3
Я очень мало знаю о JS и ничего о других. Однако за 40 лет программирования я обнаружил, что СОХРАНЕНИЕ чисел в виде СТРОК с последующим преобразованием в значения по мере необходимости устраняет большинство, но не все проблемы, связанные с округлением.

Будет ли это работать для вас? Без понятия, но, возможно, стоит попробовать.

Поскольку вы имеете дело с денежными числами, я бы хранил их без десятичной точки, подразумевая, что десятичная точка ВСЕГДА представляет собой x цифр справа, то есть 2 в случае американских долларов.

Более того, я бы никогда не стал хранить ничего, что можно вычислить на лету.

Например, я бы сохранил базовую денежную сумму и ставку налога, но НИКОГДА не сохранял бы полученную сумму, когда они умножаются вместе.
 

Webber1


Рег
31 Oct, 2012

Тем
54

Постов
212

Баллов
492
  • 04, Jun 2024
  • #4
«Я обнаружил, что СОХРАНЕНИЕ чисел в виде СТРОК с последующим преобразованием в значения по мере необходимости устраняет большинство, но не все проблемы, связанные с округлением». Спасибо.

Ну, это не настоящий сайт электронной коммерции, это просто практика.

Однако я хотел чего-то, что всегда приемлемо.

Можно ли допускать ошибки округления при работе с деньгами? Я не уверен, может нет? Или, может быть, все они приемлемы, потому что это делается с помощью правил/расчетов?
 

Magis1


Рег
03 Nov, 2013

Тем
75

Постов
190

Баллов
585
  • 08, Jun 2024
  • #5
В общем, ошибки округления НИКОГДА недопустимы при работе с деньгами. Поскольку я не очень разбираюсь в JS, я не знаю, есть ли какие-либо преимущества в использовании десятичных точек в ВЫЧИСЛЕНИЯХ или нет.

Я серьезно сомневаюсь, что это будет так.

Вы получите одинаковые ошибки округления в обе стороны. Главное, что следует учитывать, это то, что при СРАВНЕНИИ ЧИСЛЕННЫХ результатов расчетов ошибки округления заставят вас в тупик, поскольку два результата, которые ВЫГЛЯДЯТ одинаково, НЕ являются одинаковыми.

Это основная причина, по которой я храню числа в виде строк, поскольку то, что вы видите со строками, — это именно то, что вы получаете.
 

Msplatforma


Рег
01 Jan, 2011

Тем
85

Постов
192

Баллов
627
  • 10, Jun 2024
  • #6
Я очень ценю все, чему вы меня научили! Прочтите эту короткую статью, и вы поймете, откуда я. Это интересно и есть еще ссылки, если хотите, я их тоже выложу.
 

[email protected]


Рег
27 May, 2012

Тем
80

Постов
192

Баллов
612
  • 15, Jun 2024
  • #7
Потому что ваш компьютер хранит числа иначе, чем они отображаются на вашем экране. Сделайте тест. Если вы проверите истинность/ложь с помощью 0,1 + 0,2 == 0,3, ваш компьютер вернется с ЛОЖЬЮ, даже если это ВЫГЛЯДИТ так, как будто это должно быть ИСТИНОЙ.
 

Яблочко1


Рег
19 Jun, 2014

Тем
71

Постов
213

Баллов
578
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно