"For" loop index not incrementing correctly [duplicate] - javascript

This question already has answers here:
Is floating point math broken?
(31 answers)
How to deal with floating point number precision in JavaScript?
(47 answers)
Closed 3 years ago.
When I run a “For” loop and I log the index used in it with increments of 0.1 , starting from 1, the outcome is not a number with a single decimal digit, but something with multiple decimal digits (code and results are shown here below).
for (let i = 1; i <= 2; i += 0.1) {
console.log(i);
};
What I expected is to see the following series:
1
1.1
1.2
1.3
...
instead what I actually get is:
1
1.1
1.2000000000000002
1.3000000000000003
1.4000000000000004
1.5000000000000004
1.6000000000000005
1.7000000000000006
1.8000000000000007
1.9000000000000008
This happens in every browser, in the same way either I compile the loop directly in the Console DOM or I code within Visual Studio Code.
Does anyone have an explanation about it?

Have you tried incrementing by 0.100000000000000?
Or using i = i.toFixed(1)? This will round the number to one decimal place. May not be what you need as toFixed will convert the number to a string

Related

How to convert "23.99999999999999" (repeating decimal with a repetend of 9) to "24" (correct integer) in JavaScript? [duplicate]

This question already has answers here:
How to deal with floating point number precision in JavaScript?
(47 answers)
Closed 24 days ago.
When I execute the JavaScript code 8/(3-8/3), the result is displayed as 23.99999999999999, but I want to fix it to 24.
In order not to round numbers when they are not repeating decimals or when their repetend is not 9 (e.g. do not round 21.835 to 22; do not round 2.979797979797 to 3), how should I solve this problem?
There doesn't seem to be a clear way to resolve this issue without using some sort of rounding function, but there are alternative ways to write this specific equation, according to MathsIsFun
E.g.
8/(1/3)

What's the deal with big number faulty arithematic in JS? [duplicate]

This question already has answers here:
What is JavaScript's highest integer value that a number can go to without losing precision?
(21 answers)
Large numbers erroneously rounded in JavaScript
(6 answers)
javascript large integer round because precision? (why?)
(2 answers)
Closed 1 year ago.
So, I found something I couldn't understand and can't find any internet resource that explains it.
Please see the code below:
var num = 35422484817926290
// subtract 5 from num
console.log(num-5)
Output (Wrong) : 35422484817926284
I checked it in Node, Opera, and Chrome, all of them give the wrong answers.
I do understand the fact that arithmetic with unsafe Integers in JS is faulty, for example:
console.log(100000000000000005-1)
Output (Wrong) : 100000000000000000
So what's the deal with big number arithmetic in JS?
When I run this code:
var num = 35422484817926290
// subtract 5 from num
console.log(num-5)
in Visual Studio Code, i get the following warning:
"Numeric literals with absolute values equal to 2^53 or greater are too large to be represented accurately as integers."
So the correct way to make this calculation would be like this:
var num = 35422484817926290n
// subtract 5 from num
console.log(num-5n)
JavaScript is not faulty, this is how the Floating point arithmetic works. Looks duplicate to this post. For better calculation involving floating-point numbers you should use BigNumber API.

Why the result is like this [duplicate]

This question already has answers here:
Is floating point math broken?
(31 answers)
Closed 4 years ago.
var tm=110;
var fm=200;
var pr=Math.ceil(tm/fm*100);
console.log(pr);
The result is showing 56.
But it should be 55
Note that
tm/fm*100 is resulting 55.0000001
But
When tm=100 and all fm=200 then the result is 50
I've solved that problem concedering upto 2 decimal places after point, I could not understand where from 1 is comming after some 0s!
Math.ceil() returns the smallest integer greater than or equal to a given number. See MDN Documentation.
Remove Math.ceil()
parseFloat() pr variable
Call Float's precision method toPrecision(8)
The extra 1 you are seeing is a result of binary floating point math. JavaScript does this. Source
<script>
var tm=110;
var fm=200;
var pr= parseFloat(tm/fm*100);
alert(pr.toPrecision(8)); // output: 55.00000000
</script>

Javascript plus equals 0.5 adding 0.50000000001 [duplicate]

This question already has answers here:
Is floating point math broken?
(31 answers)
Closed 4 years ago.
I'm adding 0.5 to a number every second. However, it seems to be adding 0.5000000000001 instead.
window.setInterval(function() {
number += 0.5;
// it says number as 0.50000000001, and after 1.00000000002
}, 1000);
Does anybody know why this is happening?
It is a limitation of floating point numbers. They are not that accurate and hence the values that you have obtained.

JS number function adds up zeros at the end [duplicate]

This question already has answers here:
JavaScript summing large integers
(10 answers)
Closed 5 years ago.
I am using the Number() JS function which is supposed to convert string value to numeric.
It's working fine for small numbers. For big ones - it is starting to substitude values with zeros as shown on the image:
Is there a work around for this problem?
In JS, the largest integral value is 9007199254740991 That is, all the positive and negative integers should not exceed the -9007199254740991 and 9007199254740991 respectively.
The same is defined as the 253-1.
console.log(Number.isSafeInteger(parseInt('1111111111')))
console.log(parseInt('1111111111'))
console.log(Number.isSafeInteger(parseInt('111111111111111111')))
console.log(parseInt('111111111111111111'))
//9007199254740991 - The largest JS Number
console.log(Number.isSafeInteger(parseInt('9007199254740991')))
This is because you're using numbers that are larger than Number.MAX_SAFE_INTEGER and Javascript does not guarantee to represent these numbers correctly
Use Number.isSafeInteger to check:
> Number.isSafeInteger(Number('111111111111111111'))
< false

Categories