Подтвердить что ты не робот

Каковы наилучшие практики, связанные с суммой доллара в JSON?

Каковы наилучшие практики, связанные с суммой доллара в JSON?

Передача суммы в виде строк или плавающих? или другой?

Мы немного обеспокоены ошибками округления, отображаемыми на клиенте (iOS/Android/Web), или, возможно, разными значениями, отображаемыми на одном клиенте по сравнению с другим.

4b9b3361

Ответ 1

Эффективная Java, 2-е издание Джошуа Блох сказал

Поплавковые и двойные типы особенно плохо подходят для денежных расчетов, потому что невозможно представить 0,1 (или любую другую отрицательную мощность в десять) как плавающий или двойной точно.

Например, предположим, что у вас есть 1,03 доллара, а вы тратите 42c. Сколько денег у вас осталось?

System.out.println(1.03 -.42); распечатывает 0.6100000000000001.

Правильный способ решить эту проблему - использовать BigDecimal, int или long.

Никогда не удерживайте денежные значения в переменной float. Плавающая точка не подходит для использования в валюте как фиксированной, так и десятичной.

Лучше, если указать код валюты и такое же значение в нескольких разных форматах. Рассмотрим этот типичный ответ на сумму 0,00234

"amount": {
  "currency": "USD",
  "decimal": 0.00234,
  "integer": 234000,
  "integer_scale": 8,
  "pretty": "\u0e3f 0.00234 BTC",
  "string": "0.00234"
}

У вас есть возможность использовать любой из предоставленных форматов.

decimal: это десятичное число string: То же, что и десятичный, но цитируется, поэтому ваша библиотека JSON считает, что это строка. pretty: строка, которая будет показана пользователям. Включает соответствующий знак валюты и код валюты. currency: 3-буквенный код для валюты.

Ниже приведены два примера API:

1 - Коды общей валюты в JSON

{
    "USD": {
        "symbol": "$",
        "name": "US Dollar",
        "symbol_native": "$",
        "decimal_digits": 2,
        "rounding": 0,
        "code": "USD",
        "name_plural": "US dollars"
    },
    "CAD": {
        "symbol": "CA$",
        "name": "Canadian Dollar",
        "symbol_native": "$",
        "decimal_digits": 2,
        "rounding": 0,
        "code": "CAD",
        "name_plural": "Canadian dollars"
    },
    "EUR": {
        "symbol": "€",
        "name": "Euro",
        "symbol_native": "€",
        "decimal_digits": 2,
        "rounding": 0,
        "code": "EUR",
        "name_plural": "euros"
    }
}

https://gist.github.com/Fluidbyte/2973986

2 - API-интерфейс Fixer

http://api.fixer.io/latest

{
    "base": "EUR",
    "date": "2017-07-28",
    "rates": {
        "AUD": 1.4732,
        "BGN": 1.9558,
        "BRL": 3.7015,
        "CAD": 1.4712,
        "CHF": 1.1357,
        "CNY": 7.9087,
        "CZK": 26.048,
        "DKK": 7.4364,
        "GBP": 0.89568,
        "HKD": 9.1613,
        "HRK": 7.412,
        "HUF": 304.93,
        "IDR": 15639,
        "ILS": 4.1765,
        "INR": 75.256,
        "JPY": 130.37,
        "KRW": 1317.6,
        "MXN": 20.809,
        "MYR": 5.0229,
        "NOK": 9.3195,
        "NZD": 1.5694,
        "PHP": 59.207,
        "PLN": 4.2493,
        "RON": 4.558,
        "RUB": 69.832,
        "SEK": 9.5355,
        "SGD": 1.5947,
        "THB": 39.146,
        "TRY": 4.1462,
        "USD": 1.1729,
        "ZAR": 15.281
    }
}

Каков стандарт форматирования валютных значений в JSON?

Ответ 2

Я думаю, что одно решение - передать количество раз 100 как целое число

  • $100 → 10000
  • $1.5 → 150
  • $19.99 → 1999

(Нет ошибок округления, безопасного хранения в базе данных, если вам не нужно больше десятичных знаков, если вы используете это на рынке обмена валюты, например).

Таким образом, вы можете манипулировать своими суммами (добавлением или умножением,..) и отображать его снова, разделить на 100.

Ответ 3

JSON не имеет разных типов для целых чисел и с плавающей запятой значения. Поэтому JSON Schema не может использовать только один тип, чтобы различать между целыми и нецелыми.

Следовательно, вы можете попробовать что-то вроде этого.

var jsonObj = [{
"amount": "$1234.46"
},{
"amount": "$2234.56"
},{
"amount": "$3234.66"
}];

for (var i in jsonObj) {
  jsonObj[i].amount = '$'+Math.round(jsonObj[i].amount.substring(1,jsonObj[i].amount.length));
}

console.log(jsonObj);

Ответ 4

Я не думаю, что в этом есть "лучшая практика".

Моя рекомендация, однако, заключалась бы в том, чтобы кодировать их как float, чтобы вы не смешивали способы отображения долларов. В качестве примера вы хотели бы избежать, возможно, перехода

{ "dollars": "1,000$" }
{ "dollars": "1000.00$" }
{ "dollars": "1000.00" }
{ "dollars": "$1000.00" }

Простейший способ представления долларов - использование float. Точность может меняться, что может быть хорошо.

{ "dollars": 1000.00 }
{ "dollars": 0.001231231 }

Следите за тем случаем, когда 0.00 делает 0,001 из-за округления

{ "dollars": 0.005 }