JavaScript 大十进制验证表

JavaScript validation form for big decimal

I have a form validated by a script, the value of the form cannot be greater than 5. But if you enter 5.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 the form is validated and the value is rounded, how can I do the validation with a large number没有四舍五入的小数位?

也许你可以试试 Math.round() 函数。它将您的小数四舍五入为整数。在您的情况下,它将向下舍入为 5。 因此,您的代码将如下所示:

let val = Math.round(5.00000000000000000000000000000000000000001) 
console.log (val)
//Expected output : 5

一定要看看这个 link 以便更好地理解。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round

首先我必须问你真的需要这么大的数字精度吗?这对我来说似乎不切实际。

JS 数字在内部都被视为 IEEE 754 floating point numbers,又名 Float64。这种格式只能存储大约 15-17 位有效的十进制数字。对于你的情况,它可以存储的最大努力是 5.000000000000001 有 14 个零,放入更多的零它会超过它的精度存储容量并被丢弃。

所以在引擎盖下数字没有四舍五入,它实际上是信息丢失,最后一块 ...001 没有地方可以存储所以丢弃,留下 5.0000...000.

回到你的问题。如果你真的需要一个解决方案来存储精度非常高的数字,看看 bignumber.js 库,看看 docs。它可以以任意有限精度存储数字(但不是无限精度,如 1/3 = 0.333...33)。

代替 JS 原语 number 类型,数字将被表示为 BigNumber 对象,这需要更多内存 space 并且计算速度较慢。您不能使用 +-*/!==, === 等普通算术运算符。你必须去 BigNumber.plus(x)BigNumber.eq(x).

所以你牺牲了易用性、速度和内存效率来换取大精度。这是一个 trade-off 您需要评估您的用例是否值得。

我通过简单地在点(逗号)后拆分数字字符串解决了这个问题。在表格中输入极端数据后,小数部分得到验证

function validateY(inp) {
    let elemY = ($('#y_set'))
    let c = (inp.value.replace(',','.'))
    c = c.split('.')
    c = Number(c[1])
    let val = Number((inp.value.replace(',','.')))
    if ( isNaN(val) || typeof(val) != "number" || elemY.val()==="" ){
            return false
    }else if (val === 5 && c > 0)  {
        return false
    }else if (val === -3 && c > 0)  {
        return false
    }
    return val <= 5 && val >= -3
}

c 变量 - (字符串拆分为整数和分数)。 5和-3是形式允许的极值

不好意思,还在学习中