科学健康资讯 · 内容仅供参考,不替代专业诊疗 联系我们|疾病百科
操作系统

math round(math.round函数保留两位小数)

2023-06-06 操作系统 本文链接

#程序员# #前端# #html+css#

JS计算两个经纬度的距离

var mapNumberUtil = {};

/**

* 计算两个经纬度的距离(千米)

*/

mapNumberUtil.getDistance = function(lat1, lng1, lat2, lng2){

var radLat1 = lat1*Math.PI / 180.0;

var radLat2 = lat2*Math.PI / 180.0;

var a = radLat1 - radLat2;

var b = lng1*Math.PI / 180.0 - lng2*Math.PI / 180.0;

var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +

Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));

s = s *6378.137 ;// EARTH_RADIUS;

s = Math.round(s * 10000) / 10000;

return s;

}

不管是float类型还是double类型的浮点数,在计算机存储时,都是不准确的。

这是因为计算机不可能提供无限的空间让程序去存储这些二进制小数。

而跟采用C、JAVA、PHP、JS、GO、LUA等哪一种编程数据无法。

比如在JS中,

运行8.54/2.5/0.4,得到的结果是8.539999999999997。

运行parseFloat(6.99*0.1),得到的结果是0.6990000000000001。

因此,在对浮点数类型的数据a和b进行相等比较时,我们不能通过"="号来比较。

而应该对两个数据的差值的绝对值小于一个比较小的数据来判断是否相等。

比如:

if(abs(a-b)<1e-6)。

虽然这是每一个程序员都应该知道的常识,

但是即使是我们公司的经验丰富的程序员在设计控制器的网页时,也因为疏忽了浮点数的这一特性,而走了一些弯路。

代码如下:

var ft=st_fa[ind].name;

var setv = st_fa[ind].setval / Math.pow(10, st_fa[ind].digs);

var inp=prompt("设置"+ft+"的开度,单位为:"+st_fa[ind].sunit,setv);

if(inp == null){

return;

}

try

{

var va=st_fa[ind].setvar;

var vv = parseFloat(inp);

vv = vv * Math.pow(10, st_fa[ind].digs);

if((vv >= st_fa[ind].minval) && (vv <= st_fa[ind].maxval)){

this.savevar(va,vv);

}else{

alert("数值错误");

}

}catch(e){

alert("数值错误");

}

由于在通过ajax技术向控制器写入数据时,没有对传入的浮点型数据vv强制转成整型。

控制器收到之后,仍然按整型进行解析,使得存入的数据远超过最大值。

之后,进行了一次改动,如附图,通过parseInt函数将浮点型的数据强制转成整型。

另一个问题冒了出来,明明输入了69.99,存入控制器才读出来确成了69.98。

所有输入为xx.99的数据,存入再读出都成了xx.98。

->用户在弹出框中输入69.99之后,程序通过vv=parseFloat(inp)将vv赋值为69.989999999999。

->在将浮点数存成二进制数时造成了精度的变化。

->根据两位小数点转成整型时,即vv= vv * Math.pow(10, st_fa[ind].digs);

->得到了:6998.999999999999。

->通过parseInt函数转成整数,得到了6998。

问题在于,因为浮点数存储的不准确性,我们不应该通过parseInt取值,而应该用四舍五入函数Math.round来取整,使得精度损失最小。

所以,我们最终改成了附图3的代码。

给有能力学生挑战

369的秘密

今早GMC发布了北美数学联盟趣味活动(Continental Math League) 赛事。 前天,网上流传着JYB取缔杯赛的名单。其中涉及明年1月份要考试的希望数学冬令营。部分家长做了退费处理。 其实我觉得这个赛事会长期存在。 国内的被禁了,还有国际的。目前学而思就是主推国际杯赛。自从GMC上线以来,几乎每个月都有杯赛。但是由于是国际的杯赛,大多数得不到国内的认可,注定目前的规模都不会大。很多BS都不知道卷子难度,今年第一年推广。明年大家就熟悉了。 下面是这次BS的介绍: CML 中国区采取哈佛麻省理工大学数学挑战活动 HMMT经典的车轮战(Guts Round) 规则。 选手将会得到 3-5 套题目,每做完一轮题目即可进入下一轮题目,每轮题目最长的解题时间不超过 30 分钟。每轮结束后学生可在排名榜 (Score Board)上看到即时排名,学生最终的排名将根据学生解题的正确性和答题的速度决定。 1-3 年级一共 3轮 18 道题目

Math and English

本文内容仅供健康科普参考,不能替代专业医疗诊断和治疗建议。如有身体不适,请及时就医并遵从医师指导。

相关阅读