你真的懂代码么?

来看这段简短的代码(此类的数学问题在程序中经常发生颠覆性的错误)
public class TestDouble{
        public static void main(String [] args){
        System.out.println(10.00 - 9.10);
     }
}
你可能会很天真的以为会期待该程序能够打印出0.90,或者打印该Double类型的值最靠近的临近值区的最短的小数,它在小数点前后都至少有一位,因此0.9或许才是合理的,但是如果你运行该程序,你就会发现它打印的是0.8999999999999999,而问题出在哪呢?9.1真的能够在计算机中精确的表示么?只能这么说计算机和现实最大的不同(也是问题的根源)就是,世界是连续的,而计算机是非连续的,是离散的。人类在计算机中模拟现实,但是不能够完全的表示现实的环境。
再例如下面的例子出现的情况:
public class Elementary{
       public static void main(String[] args){
       System.out.println(12345+5432l);
      }
}
事物往往有别于它的表象,它并没有打印出我们想要的输出66666,却打印出17777,难道是程序对于这个非常的数字有偏见么?那请仔细注意左操作数开头的数字1和右操作数结尾的小写字母l之间的细微差异,也许...也许当初允许用小写的l来编写long型字面常量本身就是一个错误。 当你制定一条规则或者方法的时候是不是也考虑了以后将要发生的灾难,当后人第一次接触你的规则的时候就被迷惑了,我们也只能体谅前人,然后继续的改善基本的规则问题。
还有也许很多人第一次接触编程时,对i = i + 1 都感到百思不得其解
“i加上1怎么可能和i相等呢?”
后来慢慢知道了,不,确切的说,是慢慢地接受了,接受了=是赋值(前提是你学的不是pascal),因为你可能根本没有思考,只是被动接受
再后来,我们学了 if, 开始写分支代码:
if (a >3) {
// do something
}
if (a < 5) {
// do something
}

但是当我们写出 if (3 < a < 5) 时,居然报错了,又百思不得其解,后来被教导了,这么写是错的,应该if (a>3 && a<5)。 于是我们又开始接受了,认为这么写是理所当然的,而且以后的代码都是这么写的。直到有一天,你看了 python 的入门手册,尼玛,居然逆天的出现了 ‘if 3 < a < 5:’,当时绝对又震惊了,“怎么可以这么写?”。 难道你忘了,N年前你就是这么写的,而且当时你不也认为3 < a < 5是理所当然的吗(任何一个高中生都会同意这种写法), 为什么你现在又开始觉得3 < a < 5是种逆天写法呢,因为你在这几年的编程生涯中,已经被动接受了太多太多的东西,而且使你根本就不曾思考过,当你被告知了,在编程中=是赋值的意思(其实他们没有告诉你,只是大部分语言这样,还有很多语言不是这样,比如pascal中:=是赋值,比如basic/VB中=即是赋值也是判断), 但是=如果不是相等的话,那肯定有表示相等的,对,就是==,或者===。不管是==还是=,「相等」到底是什么意思呢?=或者==或者===,即使以后会出现====,到底和数学的「相等」有多少出入呢?

在集合论中,相等的三要素:

  1. 自反性: A等于A
  2. 对称性: 如果A等于B,那么B等于A
  3. 传递性: 如果A等于B,而且B等于C,那么A等于C

当你在编程中遇到传说中的NaN(Not A Number),它是在IEEE浮点数规范中明确定义的,然而它不等于任何值,更奇怪的是它却不等于本身。当学到数学的定理的时候我们有没有真正怀疑过?脱离了数学,进入了编程领域,当你遇到了很多百思不得其解的时候,是默认的接受了?还是认真思考过呢?

最后灰常感谢Justjavac给与无限的帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值