将整数保存为浮点数

时间:2014-07-27 03:35:50

标签: javascript jquery

function prec(numb){
    var numb_string = numb.toString().split('.')

    return numb_string[(numb_string.length - 1)].length
}
function randy(minimum, maximum) {
    var most_accurate = Math.max ( prec(minimum), prec(maximum) );

    return ( ( Math.random() * ( maximum - minimum ) + minimum ).toFixed( most_accurate ) );
}

// returns random numbers between these points. 1 decimal place of precision:
console.log( randy(2.4,4.4) );

// returns random numbers between these points. 3 decimal places of precision:
console.log( randy(2.443,4.445) );

// returns random numbers between these points. Want 3 decimal places of precision. However, get 0:
console.log( randy(2.000,4.000) );

// Why do I get 0 decimal places? Because floats are rounded into integers automatically:

console.log( 4.0 ); // want 4.0 to be logged. Instead I get '4'

您无需阅读这些功能的工作原理。只是控制台日志。

基本上,我需要在两点之间返回一个精确度的随机数。精度自动派生自传递给randy函数的最精确浮点数。

当数字范围为3.5 3.734.4322 800.3233但不是2.03.0或{{1}时,此方法正常},4.0000

然后该数字似乎自动保存为整数:

5.0000

我想扩展Number原型,以便将console.log( 2.0 ) //=> 2保存为2.0,以便此函数可以找到精度:

2.0

目前认为function prec(numb){ var numb_string = numb.toString().split('.') return numb_string[(numb_string.length - 1)].length } 的精确度为0位小数,因为如果3.000000000作为3E8参数传入,则会将其读作numb。我希望它读作3

虽然我可以做到这一点3.000000000但是它变得难以理解,对于较小的精确度来说,这无疑更好:randy(2.toFixed(3),3.toFixed(3))

这可能吗?

Fiddle

2 个答案:

答案 0 :(得分:1)

JS中只有一种数字类型 除了类型本身的不足(也导致其他语言的头痛),这是一件好事。

如果要显示精度,请使用num.toFixed(n);将数字存储为字符串,四舍五入到您请求的精度。

您可以稍后在代码中解析字符串,对其进行操作,然后在结果上调用.toFixed(n);,以保持精度......

但是除非你有特殊的需求,或者将几段代码混为一谈,你是不是要关注舍入不准确性,而不仅仅是操作全精度值,然后舍入/格式化最终结果?

当然还有很多其他解决方案......

...使用int跟踪强制精度,表示值......或者根据首选精度保持一个表示浮动值的int作为int ... 1.235变为[1, 235]

......任何事情都是可行的 但是,子类化确实不会成为答案。

答案 1 :(得分:0)

您可以定义一个帮助您解决问题的类,尤其是使用toSting函数

function NewNumber()
{
    this.value = (typeof(arguments[0]) == "number") ? arguments[0] : 0;
    this.decimal = (typeof(arguments[1]) == "number") ? arguments[1] : 0;
    this.Val = function()
    {
        return parseFloat(this.value.toFixed(this.decimal));
    }
    this.toString = function()
    {
        return (this.value.toFixed(this.decimal)).toString();
    }
}

创建一个这样的数字

var Num = NewNumber(4.123545,3); 
// first argument is the value 
// and second one is decimal

要获取变量的值,您应该使用函数Val,如下所示

console.log(Num.Val()); // this one prints 4.123 on your console

然后是toString函数

Num.toString() // it returns "4.123"
(new NewNumber(4,4)).toString(); // it returns "4.0000"
你的函数中的

使用NewNumber类的toString来解决你的问题