剑指offer_第三章高质量的代码

代码质量,是指代码的容错处理能力,对一些特别的输入会询问coder是否考虑和如何处理,不能容忍代码只是针对一种假想的‘正常值’进行处理,不考虑异常状况,也不考虑资源回收的问题等等
java 中浮点数的比较
插:java中浮点数的比较

System.out.println(0.1d == 0.1f);

这样的结果是false,因为精度的丢失导致结果是不对的那么问题来了,到底为什么不对呢?
类型升级:
运算符两边的数值类型不同,首先会进行类型升级(type promotion)规则如下:

  • 如果运算符任意一方的类型为double,则对方会转换成double
  • 否则,如果运算符任意一方的类型为float,则另一方会转换为float
  • 否则,如果运算符任意一方的类型为long,则另一方会转换为long
  • 否则,两边都会转换为int
    首先进行类型的升级,再执行浮点数的相等比较,那么上面那个例子float首先会升级成为double,然后执行浮点数相等比较。
    总结一下:
    在进行浮点数比较的时候,主要需要考虑3个因素

NaN
无穷大/无穷小
舍入误差
NaN和无穷出现的可能场景如下

在这里插入图片描述
考虑功能测试的时候,我们要尽量突破常规思维的限制。面试的时候我们经常受到惯性思维的限制,从而看不到更多的功能需求。比如 打印1 到最大的n 位数,很多人会简单化思维,最大的三位数是999 最大的四位数是9999, 这些数字很容易算出来,但是最大的n位数字并不是都可以用int 类型的来表示,超过int 类型范围的我们可以考虑用longlong 类型,超出longlong 能够表示的范围,是否考虑任意大的数字? 如果要求是任意大的数字,那么我们就需要特殊的数据结构的构造来表示数字,比如用字符串或者数组来表示大的数字,以确保不会溢出。
其次我们需要考虑这种边界值,很多时候我们的代码中都会有循环或者递归,如果我们的代码是基于循环,那么结束循环的边界条件是否正确? 如果是递归,递归的种植边界是否正确,这些都是边界测试需要考虑的用例。还是以字符串转换成整数的问题为例, 我们写出的代码应该确保能够正确转换最大的正整数和最小的负整数
除此以外海需要考虑这种可能的错误输入,也就是常说的负面测试的测试用例当输入不符合要求的时候,应当要求程序能够给出合理的错误处理。 再设计把字符串转换成整数的函数的时候,我们就要考虑当输入的字符串不是一个数字,比如"1a2b3c",我们怎么告诉函数的调用者这个输入是非法的。
除此以外我们还应当考虑,代码的可拓展性和可维护性。
面对错误的处理方式一般有3种
1 函数用返回值来告知调用者是否出错
2 当发生错误时设置一个全局变量,此时我们可以在返回值中传递计算结果了。
3 抛异常
三种方式的比较;在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值