FineUI 官方论坛

标题: 【有意思】NumberBox长度超过16位的数字时会自动把末位变 [打印本页]

作者: apoul    时间: 2013-5-4 20:50
标题: 【有意思】NumberBox长度超过16位的数字时会自动把末位变
[attach]2275[/attach]
[attach]2276[/attach]
如图,第一张图是16位数字,从数据库里读出来显示,第一个是用TextBox显示,正确,第二个是用NumberBox显示,正确。
第二张图是17位数,第一个是用TextBox显示,正确,第二个是用NumberBox显示,错误。


作者: sanshi    时间: 2013-5-4 22:21
这个问题真有意思,我们来看几个JavaScript例子:
  1. var a = 1111111111111111; // 16个数字
  2. console.log(a); // 结果是1111111111111111
  3. var a = 11111111111111111; // 17个数字
  4. console.log(a); // 结果是11111111111111112
  5. var a = 111111111111111111; // 18个数字
  6. console.log(a); // 结果是111111111111111100
  7. var a = 1111111111111111111; // 19个数字
  8. console.log(a); // 结果是111111111111111200
  9. var a = 11111111111111111111; // 20个数字
  10. console.log(a); // 结果是11111111111111110000
复制代码
再来看几个例子:
  1. var a = "1111111111111111"; // 16个数字
  2. console.log(parseFloat(a)); // 结果是1111111111111111
  3. var a = "11111111111111111"; // 17个数字
  4. console.log(parseFloat(a)); // 结果是11111111111111112
  5. var a = "111111111111111111"; // 18个数字
  6. console.log(parseFloat(a)); // 结果是111111111111111100
复制代码
是不是这个数字太大,JavaScript表示不了了?也不是!
  1. Number.MAX_VALUE // 1.7976931348623157e+308
复制代码

再来看:
  1. var a = "11111e100"; // 1后面有100多个零
  2. console.log(parseFloat(a)); // 结果是1.1111e+104
复制代码


========================

所以应该是JavaScript表示数字的精度不够了,看网上有提到这个问题的:http://zhidao.baidu.com/question/49623416.html
对于精度是6位或7位的问题,float型(4字节32位)精度确实是6位或7位,而double型(8字节64位)精度是15或16位.


所以,对于如此长的数字,就不要用NumberBox控件了。

作者: apoul    时间: 2013-5-5 08:13
{:soso_e179:}最后我是用TextBox,然后用Regex属性来验证数字。以前都没现这属性,看来还要继续研究啊。




欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4