I am currently creating a math package based on JavaScript that focuses on rounding on various significant digits (SF) , but I ran into a problem I'm trying to solve.
More on this issue later, but first a little background for you.
The program is designed to select a completely random number in a given range and then automatically generate this number corresponding to significant digits; eg:
Random number: 0.097027 S.Fs: 9, 7, 0, 2, 7
Here is a screenshot of what I did for the visual presentation:

, , , "SF" , , 1, 2, 3 4 S.Fs .
SF (1-4) , X SF , , SF .
, , . ...
, (0.097027); , , 4 S.F .
3 SF, :
: 0.097027 3 S.F Rounded Up/Down/Off: 0.0970
, :
: 0.097027 3 S.F Rounded Up/Down/Off: 0.097
. , , .
, , , . toFixed(x), toFixed(4), , , 5 , . 89.404 > 10, . `0,000020615.
, , toFixed /, toFixed(n) , , , ?
:
function generateNum() {
do {
genNumber = Math.random() * Math.pow (10, randomRange(-5, 5));
genNumber = roundToNSF(genNumber, 5, 0);
}
while (!countNonZero(genNumber) || genNumber < 1E-05 || genNumber == 0);
genNumber = roundToNSF(genNumber, 5, 0);
genNumber = String(genNumber);
genNumber = Number(genNumber);
}
function randomRange(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function showSF3() {
removeButtonCSS();
document.getElementById('SFRounded').style.display = "block";
document.getElementById('scale').style.display = "block";
document.getElementById("SF3").className = document.getElementById("SF3").className + "buttonClick";
deleteRounded();
deleteScale();
calculateAnswer();
for (i = 3; i < 4; i++)
{
sfRoundedTextBlock = document.getElementById('SFRounded');
sfRoundedTextBlock.innerHTML = sfRoundedTextBlock.innerHTML + '<p><strong>Number: </strong></br>' + String(genNumber) +
'</br>' + '<strong>Rounded down to ' + i + ' SF:</br></strong>' + downArray[i] + '</br>' +
'<strong>Rounded up to ' + i + ' SF:</br></strong>' + upArray[i] + '</br><strong>Rounded off to ' + i + ' SF:</br></strong>'
+ roundedArray[i] + '</br>' + '(See the scale below for why we choose <strong>' + roundedArray[i] + '</strong> as the rounded off value.)</p>';
}
}
var roundedArray = [];
var upArray = [];
var downArray = [];
var temp;
function calculateAnswer() {
roundedArray = [];
upArray = [];
downArray = [];
for (i = 0; i < 4; i++) {
var nSF = i + 1;
temp = roundToNSF(genNumber, nSF, 0);
roundedArray[nSF] = roundToNSF(temp, nSF, 0);
upArray[nSF] = roundToNSF(genNumber, nSF, 1);
downArray[nSF] = roundToNSF(genNumber, nSF, -1);
};
};
var aNumber;
var digits;
var way;
function roundToNSF(aNumber, digits, way){
if (way == undefined) { way = 0; };
if (aNumber !=0) {
if (aNumber > 0)
{
z = log10(aNumber);
}
else
{
z = log10(-aNumber);
};
z = Math.floor(z);
var nDP = digits - z - 1;
var roundedNumber = roundToNDP(aNumber, nDP, way);
}
else {
roundedNumber = aNumber;
};
return Number(roundedNumber);
};
Update:
- , , , indexOf("."), (dp).
, dp, [1-9].
var genNumber = 0.097027;
var rString = String(genNumber);
var positionofDP = rString.indexOf(".");
var regexp = /[1-9]/;
var positionofNonZero = Number(rString.search(regexp, positionofDP));
, , "" .
, "true", //, , "0", .
, 5 12 .
, toFixed(i)? .