From df2e824cc7bdd638f1d5ce2ad6ea7859a73f6290 Mon Sep 17 00:00:00 2001 From: Tom Groves Date: Thu, 24 May 2018 12:23:28 +0100 Subject: [PATCH 1/3] fix for floating point rounding issue --- bits/60_number.js | 15 ++++++++++++++- ssf.flow.js | 15 ++++++++++++++- ssf.js | 15 ++++++++++++++- test/comma.tsv | 1 + 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/bits/60_number.js b/bits/60_number.js index 5d13dfc..cf4aa97 100644 --- a/bits/60_number.js +++ b/bits/60_number.js @@ -51,7 +51,20 @@ function hashq(str/*:string*/)/*:string*/ { } return o; } -function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); } +function rnd(val/*:number*/, d/*:number*/)/*:string*/ { + var result + if(!("" + val).includes("e")) { + result = +(Math.round(val + "e+" + d) + "e-" + d); + } else { + var arr = ("" + val).split("e"); + var sig = "" + if(+arr[1] + d > 0) { + sig = "+"; + } + result = +(Math.round(+arr[0] + "e" + sig + (+arr[1] + d)) + "e-" + d); + } + return "" + result +} function dec(val/*:number*/, d/*:number*/)/*:number*/ { if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) { return 0; diff --git a/ssf.flow.js b/ssf.flow.js index dd0607b..e8494df 100644 --- a/ssf.flow.js +++ b/ssf.flow.js @@ -312,7 +312,20 @@ function hashq(str/*:string*/)/*:string*/ { } return o; } -function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); } +function rnd(val/*:number*/, d/*:number*/)/*:string*/ { + var result + if(!("" + val).includes("e")) { + result = +(Math.round(val + "e+" + d) + "e-" + d); + } else { + var arr = ("" + val).split("e"); + var sig = "" + if(+arr[1] + d > 0) { + sig = "+"; + } + result = +(Math.round(+arr[0] + "e" + sig + (+arr[1] + d)) + "e-" + d); + } + return "" + result +} function dec(val/*:number*/, d/*:number*/)/*:number*/ { if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) { return 0; diff --git a/ssf.js b/ssf.js index cc86fea..701738b 100644 --- a/ssf.js +++ b/ssf.js @@ -307,7 +307,20 @@ function hashq(str) { } return o; } -function rnd(val, d) { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); } +function rnd(val, d) { + var result + if(!("" + val).includes("e")) { + result = +(Math.round(val + "e+" + d) + "e-" + d); + } else { + var arr = ("" + val).split("e"); + var sig = "" + if(+arr[1] + d > 0) { + sig = "+"; + } + result = +(Math.round(+arr[0] + "e" + sig + (+arr[1] + d)) + "e-" + d); + } + return "" + result +} function dec(val, d) { if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) { return 0; diff --git a/test/comma.tsv b/test/comma.tsv index dee043e..dd07060 100644 --- a/test/comma.tsv +++ b/test/comma.tsv @@ -14,3 +14,4 @@ value #.0000,,, #.0000,, #.0000, #,##0.0 ###,##0 ###,### #,###.00 123456789012 123.4568 123456.7890 123456789.0120 123,456,789,012.0 123,456,789,012 123,456,789,012 123,456,789,012.00 4321 .0000 .0043 4.3210 4,321.0 4,321 4,321 4,321.00 4321234 .0043 4.3212 4321.2340 4,321,234.0 4,321,234 4,321,234 4,321,234.00 +1234652.68499999999995 .0012 1.2347 1234.6527 1,234,652.7 1,234,653 1,234,653 1,234,652.69 \ No newline at end of file From 8c046ae94ddb021f1f49125529c7193cbb18f41d Mon Sep 17 00:00:00 2001 From: Tom Groves Date: Thu, 24 May 2018 12:34:29 +0100 Subject: [PATCH 2/3] add test for negative numbers --- test/comma.tsv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/comma.tsv b/test/comma.tsv index dd07060..ec38799 100644 --- a/test/comma.tsv +++ b/test/comma.tsv @@ -14,4 +14,5 @@ value #.0000,,, #.0000,, #.0000, #,##0.0 ###,##0 ###,### #,###.00 123456789012 123.4568 123456.7890 123456789.0120 123,456,789,012.0 123,456,789,012 123,456,789,012 123,456,789,012.00 4321 .0000 .0043 4.3210 4,321.0 4,321 4,321 4,321.00 4321234 .0043 4.3212 4321.2340 4,321,234.0 4,321,234 4,321,234 4,321,234.00 -1234652.68499999999995 .0012 1.2347 1234.6527 1,234,652.7 1,234,653 1,234,653 1,234,652.69 \ No newline at end of file +1234652.68499999999995 .0012 1.2347 1234.6527 1,234,652.7 1,234,653 1,234,653 1,234,652.69 +-4321234 -0.0043 -4.3212 -4321.2340 -4,321,234.0 -4,321,234 -4,321,234 -4,321,234.00 From b62b1b1f144beb6be993ebfba4e68a75682cd9a6 Mon Sep 17 00:00:00 2001 From: Tom Groves Date: Thu, 24 May 2018 14:12:47 +0100 Subject: [PATCH 3/3] use indexOf for backwards compatibility --- bits/60_number.js | 2 +- ssf.flow.js | 2 +- ssf.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bits/60_number.js b/bits/60_number.js index cf4aa97..048bc65 100644 --- a/bits/60_number.js +++ b/bits/60_number.js @@ -53,7 +53,7 @@ function hashq(str/*:string*/)/*:string*/ { } function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var result - if(!("" + val).includes("e")) { + if(("" + val).indexOf("e") === -1) { result = +(Math.round(val + "e+" + d) + "e-" + d); } else { var arr = ("" + val).split("e"); diff --git a/ssf.flow.js b/ssf.flow.js index e8494df..35d545e 100644 --- a/ssf.flow.js +++ b/ssf.flow.js @@ -314,7 +314,7 @@ function hashq(str/*:string*/)/*:string*/ { } function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var result - if(!("" + val).includes("e")) { + if(("" + val).indexOf("e") === -1) { result = +(Math.round(val + "e+" + d) + "e-" + d); } else { var arr = ("" + val).split("e"); diff --git a/ssf.js b/ssf.js index 701738b..494e499 100644 --- a/ssf.js +++ b/ssf.js @@ -309,7 +309,7 @@ function hashq(str) { } function rnd(val, d) { var result - if(!("" + val).includes("e")) { + if(("" + val).indexOf("e") === -1) { result = +(Math.round(val + "e+" + d) + "e-" + d); } else { var arr = ("" + val).split("e");