2015-11-20 2 views
4

Я стараюсь хранить одну float значения через Buffer в Node.jsВ Node.js/V8 нет реального типа float?

> f = 3.3 
3.3 
> var buf = new Buffer(32) 
> buf.writeFloatBE(f); 
4 
> g = buf.readFloatBE(); 
3.299999952316284 

Тогда я нашел сохраненное значение g после readFloatBE() НЕ равно исходных f.

После дальнейшего исследования эти два значения буфера, хранящиеся g и f, являются такими же.

> var buf1 = new Buffer(4); buf1.writeFloatBE(f); buf1 
<Buffer 40 53 33 33> 
> var buf2 = new Buffer(4); buf2.writeFloatBE(g); buf2 
<Buffer 40 53 33 33> 

Согласно этому Buffer reading and writing floats, мы знаем, что writeDoulbeBE следует использовать здесь.

> var buf3 = new Buffer(8); 
> buf3.writeDoubleBE(f); 
8 
> h = buf3.readDoubleBE(); 
3.3 
> h === f 
true 

Я хочу знать, почему float типа не используется в Node.js или V8? Обратитесь к code из V8

// Fast primitive setters 
    V8_INLINE void Set(bool value); 
    V8_INLINE void Set(double i); 
    V8_INLINE void Set(int32_t i); 
    V8_INLINE void Set(uint32_t i); 

Кажется, нет НИКАКОГО float типа в V8, какой-либо причине такой конструкции или я что-то отсутствует? В этом случае, должна ли использоваться эта функция writeFloatBE()?

ответ

4

Кажется, нет НИКАКОГО float типа в V8

Да, и это дизайн: Там нет float типа в JavaScript либо. Все номера являются double s as specified by the ECMAScript standard. Поэтому 3.3

Ваш номер f это с double точностью, в то время как g имеет только float точность. Как вы можете видеть, это не то же самое, что и у f. То же самое произойдет, если вы использовали один из методов buf.writeInt…, результатом после прочтения будет только 3 не 3.3.

В таком случае, следует ли использовать функцию writeFloatBE()?

Да, конечно, его следует использовать, когда вы хотите хранить номера с точностью float в буфере. Если вы хотите сохранить f с полной точностью, вместо этого используйте writeDoubleBE.