Прехвърляне към плаващ в Javascript като в c#

c# код:

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# е същото като c в js. По принцип трябва да закръгля числата в javascript по същия начин, както го прави c# (удвояване за плаване)


person Denis Gursky    schedule 11.04.2014    source източник
comment
stackoverflow.com/ въпроси/11085052/   -  person adeneo    schedule 11.04.2014
comment
Изглежда вероятно, че 1176 трябва да бъде 118, когато е закръглено, а не 119, така че проблемът вероятно е в C#, а не в javascript, което изглежда го прави правилно.   -  person adeneo    schedule 11.04.2014
comment
Несъответствието е една част от десет милиарда. Какво измервате, което изисква такова ниво на точност? Нито C#, нито Javascript ви обещават, че float изчисленията винаги ще се извършват идентично от изпълнение до изпълнение; докато се поддържа минимална точност на изчисление, и двата езика са свободни да променят действителните резултати, както сметнат за добре. Вместо да питате как мога да гарантирам, че резултатите са идентични, което вие не можете, въпросът, който трябва да зададете, е как мога да гарантирам, че програмата ми работи правилно, когато е въведена грешка от една част от десет милиарда?   -  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