Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between floats and ints in Javascript?

I'm looking through some of the code from the Google Closure Library and I found this line:

var isNegative = number < 0.0 || number == 0.0 && 1 / number < 0.0;

I've figured that the reason for such an initially strange looking sign-check is to identify -0 as negative, but is there any reason to use 0.0 instead of 0?

like image 543
nickf Avatar asked Mar 03 '11 11:03

nickf


People also ask

What is the difference between ints and floats?

An integer is a whole number and a floating-point value, or float, is a number that has a decimal place.

Does JS differentiate between int and float?

Unlike many other programming languages, JavaScript does not define different types of numbers, like integers, short, long, floating-point etc. JavaScript numbers are always stored as double precision floating point numbers, following the international IEEE 754 standard.

What is float in JavaScript?

A floating point number parsed from the given string , or NaN when the first non-whitespace character cannot be converted to a number. Note: JavaScript does not have the distinction of "floating point numbers" and "integers" on the language level.

What is the main advantage of floats over ints?

Floating-point numbers have two advantages over integers. First, they can represent values between integers. Second, because of the scaling factor, they can represent a much greater range of values.


1 Answers

(A lot has changed since 2011 when this answer was posted - see updates below)

2019-June Update

BigInt has been out in V8 (Node.js and Chromium-based browsers) since May 2018. It should land in Firefox 68 - see the SpiderMonkey ticket. Also implemented in WebKit.

BigDecimal hasn't been implemented by any engine yet. Look at alternative library.

2015 Update

It's been over 4 years since I wrote this answer and the situation is much more complicated now.

Now we have:

  • typed arrays
  • asm.js
  • emscripten

Soon we'll have:

  • WebAssembly with the spec developed on GitHub

It means that the number of numeric types available in JavaScript will grow from just one:

  • 64-bit floating point (the IEEE 754 double precision floating-point number - see: ECMA-262 Edition 5.1, Section 8.5 and ECMA-262 Edition 6.0, Section 6.1.6)

to at least the following in WebAssembly:

  • 8-bit integer (signed and unsigned)
  • 16-bit integer (signed and unsigned)
  • 32-bit integer (signed and unsigned)
  • 64-bit integer (signed and unsigned)
  • 32-bit floating point
  • 64-bit floating point

(Technically the internal representations of all integer types are unsigned at the lowest level but different operators can treat them as signed or unsigned, like e.g. int32.sdiv vs. int32.udiv etc.)

Those are available in typed arrays:

  • 8-bit two's complement signed integer
  • 8-bit unsigned integer
  • 8-bit unsigned integer (clamped)
  • 16-bit two's complement signed integer
  • 16-bit unsigned integer
  • 32-bit two's complement signed integer
  • 32-bit unsigned integer
  • 32-bit IEEE floating point number
  • 64-bit IEEE floating point number

asm.js defines the following numeric types:

  • int
  • signed
  • unsigned
  • intish
  • fixnum
  • double
  • double?
  • float
  • float?
  • floatish

Original 2011 answer

There is only one number type in JavaScript – the IEEE 754 double precision floating-point number.

See those questions for some consequences of that fact:

  • Avoiding problems with javascript weird decimal calculations
  • Node giving strange output on the sum of particular float digits
  • Javascript infinity object
like image 117
rsp Avatar answered Sep 28 '22 03:09

rsp