题目分析
- 在界面中让用户输入一位数
- 判断用户输入的是否是一个数,如果不是请用户重新输入,直到输入成功为止
- 让用户在界面中输入他想要把这个小数保留的位数
- 判断用户输入的保留小数是否合法,如果不是请用户重新输入,直到输入成功为止
- 将这个数四舍五入保留相应位数的小数
- 如果碰到最后小数位是0,系统自动省略
- 检验他是否是个数字类型
需求实现
需求一
在界面中让用户输入一个数
var num = +prompt('请输入你要查询的数字')
这里让用户随机输入一位数,+可以将他强转为数据类型
需求二
判断用户输入的是否是一个数,如果不是请用户重新输入,直到输入成功为止
while (isNaN(num)) {
alert('输入错误,请重新输入')
num = +prompt('请输入你要查询的数字');
}
这里用while的原因是不知道用户输错多少次,isNaN(num)是为了判断他是否是一个数字类型;
需求三
让用户在界面中输入他想要把这个小数保留的位数
var d = +prompt('请输入你要保留的小数位数')
这里让用户输入他想要把这个小数保留的位数,+可以将他强转为数据类型
需求四
判断用户输入的保留小数是否合法,如果不是请用户重新输入,直到输入成功为止
这里可能出现三种情况会错误
- 输入的不是一个数字
- 输入的不是正数
- 输入的不是整数
while (isNaN(d) || d < 0 || (d % 1 != 0)) {
alert('小数位位数必须在0-100之间,您输入的数据不再范围中...')
d = +prompt('请重新输入你要保留的小数位数')
}
这里用或者是因为在逻辑或中,返回第一个为真的表达式,第一个不满足的情况下可以继续看第二个;这里不满足任何一个都不行
需求五
将这个数四舍五入保留相应位数的小数(这里我习惯将数字复制一份)
// 先把数据复制一次
var copyNum = num;
// 将小数点向右移动n位
copyNum = copyNum * (10 ** d)
// 检查是否移动成功
// console.log(copyNum)
// 将这个数四舍五入
copyNum = Math.round(copyNum)
// 再将小数位移回去
copyNum /= (10 ** d)
// console.log(copyNum)
这里我先利用乘法将数扩大10 ** d倍,利用Math.round()把扩大的数四舍五入,在把前面扩大的数除去
需求六
如果碰到最后小数位是0,系统自动省略,补小数位数
// 补小数位数
copyNum=copyNum.toFixed(d)
需求七
检验他是否是个数字类型
if (isNaN(copyNum)) {
alert('对不起,你电脑卡了')
} else {
console.log (copyNum)
}
文中没有将他转换成别的类型,所以不存在这个问题,但是还是留下来检验比较稳妥。
总结
var num = +prompt('请输入你要查询的数字')
while (isNaN(num)) {
alert('输入错误,请重新输入')
num = +prompt('请输入你要查询的数字');
}
var d = +prompt('请输入你要保留的小数位数')
while (isNaN(d) || d < 0 || (d % 1 != 0)) {
alert('小数位位数必须在0-100之间,您输入的数据不再范围中...')
d = +prompt('请重新输入你要保留的小数位数')
}
var copyNum = num;
copyNum = copyNum * (10 ** d)
copyNum = Math.round(copyNum)
copyNum /= (10 ** d)
copyNum=copyNum.toFixed(d)
if (isNaN(copyNum)) {
alert('对不起,你电脑卡了')
} else {
console.log (copyNum)
}