ps4 4.06下载/0.58=( )/( )

微信公众号:Zero_-_Hero
粉丝:1803
视频地址复制
Flash地址复制
Html地址复制
离线看更方便
用或其他应用扫描二维码
OGTY通关率0.09%制霸
0率互制?合集
微信公众号:Zero_-_Hero
广播电视节目制作经营许可证:(沪)字第1248号
网络文化经营许可证:沪网文[6号
信息网络传播视听节目许可证:0910417
互联网ICP备案:沪ICP备号-3
沪ICP证:沪B2-
违法不良信息举报邮箱:
违法不良信息举报***: 转 3回复:浮点数0.57 0.58 造出的坑爹问题 - justjavac(迷渡) - ITeye技术网站
博客分类:
今天看到 vb2005xu 提到了一个问题
parseInt(0.59*100)
parseInt(0.58*100)
parseInt(0.57*100)
parseInt(0.56*100)
为什么会这样呢?随后又举了 PHP 的例子,结果还是一样的结果,只是函数换成了 intval,于是 vb2005xu 猜想,是不是 python 也这样呢。
这个问题看似奇特,其实还是浮点数的精度的问题,我以前写的这篇文章:
0.58*100 的结果是什么?其实大家试试就知道了,并不是想象中的 58,而是 57.99。为什么?看我上面的文章。
是 js 或者 php 这些动态语言的怪癖吗?C语言,java会这样吗?
其实 0.58*100 = 57.99 是不局限于任何语言的,是 IEEE 规定的浮点数的运算标准。一般情况下,57.99 会四舍五入到 58。需要注意的是,浮点数的四舍五入和咱们普通的数学里面的也是不同的,浮点数遇到 5 后,不一定总是入,有时也舍,具体细节不多解释了。为什么结果是 57 呢,主要是因为 parseInt 和 intval 函数。他们的规则是,从第一个数字开始,知道遇到不是数字的字符,结束。所以 parseInt("012") 结果是 10 (不要惊讶,0开头的数字是八进制)parseInt("12abc") 结果是 12 (不解释)parseInt("12.123") 结果是 1212e5 是多少呢?科学计数法,结果是 后面五个0)parseInt("12e5") 的结果呢?结果是12,因为e字符不是数字,所以后面的都忽略了。parseInt("abc") 这个呢?结果是0?如果是0的话,你让 parseInt("0abc") 情何以堪啊!结果是 NaN (Not a Number)。
----------------- 17:12 补充-----------------------------------------
vb2005xu 写道
此处的精度问题 为什么 只有0.57/0.58 这两个有问题 而 0.59 0.56 等却没有问题呢
由于时间问题,临近下班了,所以不细解释了。还是这篇文章,,仔细品味一下。如果把它们写出2进制浮点数,就明白了。其实一个令人震惊的事实就是,99%的数不能够被精确的表示为浮点数。
看到上面的表格,好像 0.59 可以精确表示一样,其实不然,首先,0.59的末尾是9,意味着他不可能被转换成有限二进制小数(why?)。肯定是一个循环小数,如果循环节超过了浮点数的尾数,那么就给人一种可以精确表示的假象。(设计到很多公式,就不写了,以后专门写博客讨论)。运行: 0.59*1e71结果: 5.9e+70运行: 0.59*1e72结果: 5.999e+71看出端倪来了吗?
75 顶36 踩
浏览 15000
那JS精度问题到底要怎么解决呢?银行的系统不敢这么干吧?他们少算一毛钱都是大事啊?
那JS精度问题到底要怎么解决呢?银行的系统不敢这么干吧?他们少算一毛钱都是大事啊?/MikeMcl/bignumber.js/
thihy 写道rensanning 写道估计很多人也会奇怪这个问题:
public static void main(String[] args) throws ParseException {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str3 = " 23:54:07";
String str4 = " 23:54:08";
Date sDt3 = sf.parse(str3);
Date sDt4 = sf.parse(str4);
long ld3 = sDt3.getTime() /1000;
long ld4 = sDt4.getTime() /1000;
System.out.println(ld4-ld3);
引用353long不会产生溢出。这里不是程序的问题,而是时间被回拨了。见:/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result/6841479写快了,不是“long不会溢出”,而是“long没有精度问题”。嗯,正解,这是上Upvote很高的一个问题。
rensanning 写道估计很多人也会奇怪这个问题:
public static void main(String[] args) throws ParseException {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str3 = " 23:54:07";
String str4 = " 23:54:08";
Date sDt3 = sf.parse(str3);
Date sDt4 = sf.parse(str4);
long ld3 = sDt3.getTime() /1000;
long ld4 = sDt4.getTime() /1000;
System.out.println(ld4-ld3);
引用353long不会产生溢出。这里不是程序的问题,而是时间被回拨了。见:/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result/6841479写快了,不是“long不会溢出”,而是“long没有精度问题”。
估计很多人也会奇怪这个问题:
public static void main(String[] args) throws ParseException {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str3 = " 23:54:07";
String str4 = " 23:54:08";
Date sDt3 = sf.parse(str3);
Date sDt4 = sf.parse(str4);
long ld3 = sDt3.getTime() /1000;
long ld4 = sDt4.getTime() /1000;
System.out.println(ld4-ld3);
引用353long不会产生溢出。这里不是程序的问题,而是时间被回拨了。见:/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result/6841479
Double a=0.59d*100d;Double b=0.58d*100d;Double c=0.57d*100d;Double d=0.56d*100d;
System.out.println("a:"+a.intValue());System.out.println("b:"+b.intValue());System.out.println("c:"+c.intValue());System.out.println("d:"+d.intValue())运行结果:a:59b:57c:56d:56Double.intValue() 是进行的四舍五入。
thihy 写道有个问题想请教一下:0.58*100 = 57.99但是0.58*1000 = 580这是为啥呢?先来个小插曲吧,1/9801的结果是多少呢?(9801是99的平方)。结果是 0.……969799…… 它的循环节是从00到99,中间没有98。0.58 转换成二进制位 0.…… 最终也会循环,0.58也就是58/100,虽然在十进制中可以精确表示为小数,但是在二进制下是循环的。因为0.58的表示是无限循环的,但是我们的计算机位长是有限的,所以我们就得截取,当把截取后的数再转换回十进制,结果是 0.用这个数代替0.58运算一下。0. * 10 = 5.0599749如果在浏览器控制台输入此表达式,会得到5.8在计算机中,运算的过程都是二进制,所以 0.58 在转换成二进制的时候,丢失了精度,因为0.58在二进制中是无限循环小数,必须得截取。在表示为规格浮点数的时候,32位或者64位,或者128位,不管表示为多少位,都得丢失精度。第二步,乘以10。得到一个二进制浮点数结果,当把这个结果转换成十进制的时候,有可能会丢失精度。在大致阅读了IEEE的规范之后,感觉好像里面对于浮点的运算(如何Round)没有强制的要求。然后观察到不同的语言都返回相同的值,联想到是不是这些程序其实都是返回的FPU的结果。而FPU又与CPU有很大的关联。在Intel的某篇日志中说,Intel ??型号是使用80bit的扩展浮点数来计算数据的,但是其余的相关细节就不太清楚了。有没有可能不同的CPU(或FPU)的平台上会返回不同的值呢?
有个问题想请教一下:0.58*100 = 57.99但是0.58*1000 = 580这是为啥呢?先来个小插曲吧,1/9801的结果是多少呢?(9801是99的平方)。结果是 0.……969799…… 它的循环节是从00到99,中间没有98。0.58 转换成二进制位 0.…… 最终也会循环,0.58也就是58/100,虽然在十进制中可以精确表示为小数,但是在二进制下是循环的。因为0.58的表示是无限循环的,但是我们的计算机位长是有限的,所以我们就得截取,当把截取后的数再转换回十进制,结果是 0.用这个数代替0.58运算一下。0. * 10 = 5.0599749如果在浏览器控制台输入此表达式,会得到5.8在计算机中,运算的过程都是二进制,所以 0.58 在转换成二进制的时候,丢失了精度,因为0.58在二进制中是无限循环小数,必须得截取。在表示为规格浮点数的时候,32位或者64位,或者128位,不管表示为多少位,都得丢失精度。第二步,乘以10。得到一个二进制浮点数结果,当把这个结果转换成十进制的时候,有可能会丢失精度。
有个问题想请教一下:0.58*100 = 57.99但是0.58*1000 = 580这是为啥呢?0.58 * 10
0.58 * 100
0.58 * 1e+3
0.58 * 1e+4
0.58 * 1e+5
0.58 * 1e+6
0.58 * 1e+7
0.58 * 1e+8
0.58 * 1e+9
0.58 * 1e+10
0.58 * 1e+11
0.58 * 1e+12
很有取的规律,格式也很好看。为什么呢?【关于此,我确信已发现了一种美妙的证法,可惜这里空白的地方太小,写不下。】呵呵。玩笑。这个不是三言两语可以解释清楚的,回头我会专门写一篇博客来讨论浮点数的问题。
前两天碰到的同样的问题,我用的是java,最终解决方案, 用double.toString() + Bigdecimal(String) 解决。很好的办法。double是用浮点数来表示小数,BigDecimal是用定点数表示小数。一个坑就是 BigDecimal(String) 参数要用字符串,而别用浮点数。
浏览: 4260059 次
来自: 天津
浏览量:15364
spring mvc demo教程源代码下载,地址:http: ...
其实最主要的是能学好《操作系统》、《算法》、《数据结构》这三本 ...
自己回复一下,原文链接 http://flarum.org/s ...
好文章,点赞的时间有点晚了,对不起

参考资料

 

随机推荐