Пишу, по большей части, про историю, свою жизнь и немного про программирование.

ECMAScript 4 people

В ECMAScript 4 (JavaScript2 будет основан на этом языке) наконец-то появилась поддержка decimal — специального типа для работы с числами с фиксированным количеством десятичных знаков после запятой. В частности, это облегчит работу с денежными операциями.

Проблематику все понимают? Если нет, то хотя бы попробуйте сложить 0.1 и 0.7, умножить сумму на десять и округлить вниз в любом языке, который поддерживает числа с плавающей точкой. В языке, где числа с плавающей точкой представляются в соответствии со стандартом IEEE 754 (что у вас есть под рукой? JavaScript, Perl, PHP, MySQL) вы получите число 7. Почему так происходит — тема отдельного разговора, вкратце — дело в представлении числа с плавающей точкой на машинном уровне (на самом деле результатом данной суммы, в данном случае, с точки зрения такой реализации, будет 0.7999999999999999, а не 0.8) .

Decimal — специальный тип (чаще всего можно встретить его в СУБД), который позволяет манипулировать числами с фиксированной точкой. Зафиксировав точку, можно перейти к такому хранению числа, где таких погрешностей не будет.

В EMCAScript 4 (а так же в языках, на нём основанных — ActionScript 3 и JavaScript 2) есть два способа объявить число как decimal:

{
  use decimal;
  
  var a = 0.1;    //  a — decimal
  var b = 0.2;    //  b — decimal
  var c = a + b;  //  c — decimal (0.3)
}

var a = 0.1m;   //  a — decimal
var b = 0.2m;   //  b — decimal
var c = a + b;  //  c == 0.3m

Суффикс «m» пришёл из «C#» и расшифровывается как «money» («деньги»). В остальных языках программирования проблему обходят, работая с целыми числами. Перед выводом их просто делят на 100.

2 комментария
Ramon (rembish.ru) 2007

Стандарт -​-​до конца-​-​ не смотрел, но сразу же возникает вопрос — после запятой фиксировано два знака или это настраиваемое ограничение? Потому как, биржевики без проблем работают с десятыми-сотыми копеек. Да и валюты колебаются с четырьмя знаками после запятой.

Евгений Степанищев (bolknote.ru) 2007

да, это число можно менять от 1 до 34. поправил соответствующее место в статье.