Привести к плаванию в Javascript, как в С#

С# код:

float floatA = 4;
float floatB = 17;
float floatC = floatA / floatB; //0.235294119

double doubleA = 4;
double doubleB = 17;
double doubleC = doubleA / doubleB; // 0.23529411764705882
float res = (float)doubleC; // 0.235294119

js-код:

var a = 4;
var b = 17;
var c = a / b; // 0.23529411764705882
var res = (a / b).toPrecition(9); // 0.235294118

Почему floatC и res равны 0,235294119 вместо 0,235294118?

doubleC в С# такой же, как c в js. В основном мне нужно округлять числа в javascript так же, как это делает С# (двойное плавание)


person Denis Gursky    schedule 11.04.2014    source источник
comment
stackoverflow.com/ вопросы/11085052/   -  person adeneo    schedule 11.04.2014
comment
Кажется вероятным, что 1176 должно быть 118 при округлении, а не 119, поэтому проблема, вероятно, в С#, а не в javascript, который, кажется, все делает правильно.   -  person adeneo    schedule 11.04.2014
comment
Расхождение составляет одну десятую миллиардную. Что вы измеряете, что требует такого уровня точности? Ни C#, ни Javascript не гарантируют, что вычисления с плавающей запятой всегда будут выполняться одинаково от запуска к запуску; до тех пор, пока сохраняется минимальная точность для каждого вычисления, оба языка могут изменять фактические результаты по своему усмотрению. Вместо того, чтобы спрашивать, как я могу гарантировать идентичность результатов, чего вы не можете, вы должны задать себе вопрос: как я могу гарантировать, что моя программа работает правильно, когда вносится ошибка в одну часть из десяти миллиардов?   -  person Eric Lippert    schedule 11.04.2014


Ответы (1)


В виде числа с плавающей запятой 4/17 = 0,23529411852359771728515625. Округлив до 9 цифр, получим 0,235294119.

В виде двойного числа 4/17 = 0,235294117647058820264049927573068998754024505615234375. Округлив до 9 цифр, получим 0,235294118.

Это округление, как и ожидалось.

person Rick Regan    schedule 11.04.2014