在这篇文章中,我们将为您详细介绍JavaScript中的精确财务计算。什么是陷阱?的内容,并且讨论关于js计算金额精度的相关问题。此外,我们还会涉及一些关于JavaScript:两个数的精确乘法、Ja
在这篇文章中,我们将为您详细介绍JavaScript中的精确财务计算。什么是陷阱?的内容,并且讨论关于js计算金额精度的相关问题。此外,我们还会涉及一些关于JavaScript : 两个数的精确乘法、JavaScript javaScript中的Date 以及对原生javaScript的扩展、javascript – ES6中块级功能的精确语义是什么?、javascript中float类型计算的精确度问题的知识,以帮助您更全面地了解这个主题。
本文目录一览:- JavaScript中的精确财务计算。什么是陷阱?(js计算金额精度)
- JavaScript : 两个数的精确乘法
- JavaScript javaScript中的Date 以及对原生javaScript的扩展
- javascript – ES6中块级功能的精确语义是什么?
- javascript中float类型计算的精确度问题
JavaScript中的精确财务计算。什么是陷阱?(js计算金额精度)
为了创建跨平台代码,我想用JavaScript开发一个简单的财务应用程序。所需的计算涉及复利和相对较长的十进制数。我想知道使用JavaScript进行此类数学运算时应避免的错误-
如果有可能的话!
答案1
小编典典您可能应该将小数点后的值乘以100,并将所有货币值表示为整分。JavaScript中没有十进制数据类型-唯一的数字数据类型是浮点数。因此,通常建议将钱作为2550
美分而不是25.50
美元。
考虑一下JavaScript:
var result = 1.0 + 2.0; // (result === 3.0) returns true
但:
var result = 0.1 + 0.2; // (result === 0.3) returns false
该表达式0.1 + 0.2 === 0.3
返回false
,但幸运的是,浮点数的整数运算是精确的,因此可以通过缩放1来避免小数表示错误。
请注意,尽管实数集是无限的,但只能用JavaScript浮点格式精确表示实数中的有限数(准确地说是18,437,736,874,454,810,627)。因此,其他数字的表示将是实际数字2的近似值。
JavaScript : 两个数的精确乘法
工作中要处理两个数的乘法,网上搜索了没有找到满意的答案,然后根据网上提供的思路自己实现了一个,重点满足容错的要求,就是不会轻易报错。
主要算法是记录小数点后位数的总长度,然后将两个数转变成整数后相乘,再根据小数点后位数的总长度将乘积转变成小数。
代码如下:
/**
* 两个数的精确乘法
* @param v1
* @param v2
*
* 对于不能处理的问题,此方法一律返回 0
*
* @returns {number}
*/
function numberMultiplication (v1, v2) {
if (isNaN(v1) || isNaN(v2)) {
return 0
}
var isNegative = false;
if ((v1 < 0 && v2 >= 0) || (v1 >=0 && v2 < 0)) {
isNegative = true;
}
var f1 = '''' + Math.abs(v1),
f2 = '''' + Math.abs(v2);
var arr1 = f1.split(''.''),
arr2 = f2.split(''.'');
var f11 = arr1[0],
f12 = 0,
f21 = arr2[0],
f22 = 0,
len1 = 0,
len2 = 0;
if (arr1.length >= 2) {
f12 = arr1[1];
len1 = f12.length;
}
if (arr2.length >= 2) {
f22 = arr2[1];
len2 = f22.length;
}
var x1 = 0,
x2 = 0;
if (f11 > 0) {
x1 = f1.replace(''.'', '''');
} else {
x1 = f12;
}
if (f21 > 0) {
x2 = f2.replace(''.'', '''');
} else {
x2 = f22;
}
var ret = x1 * x2 / Math.pow(10, len1 + len2);
if (isNegative) {
return -ret;
} else {
return ret;
}
}
JavaScript javaScript中的Date 以及对原生javaScript的扩展
原生JavaScript中的Date
JS Date 对象用于处理日期和时间。
创建 Date 对象的语法:
var myDate=new Date()
Date 对象会自动把当前日期和时间保存为其初始值。
参数形式有以下5种:
new Date("month dd,yyyy hh:mm:ss");
new Date("month dd,yyyy");
new Date(yyyy,mth,dd,hh,mm,ss);
new Date(yyyy,mth,dd);
new Date(ms);
经测试一下几种也可以:
new Date(yyyy-MM-dd HH:mm:ss);
new Date(yyyy/MM/dd HH:mm:ss);
测试截图:
注意最后一种形式,参数表示的是需要创建的时间和GMT时间1970年1月1日之间相差的毫秒数。各种函数的含义如下:
month:用英文表示月份名称,从January到December
mth:用整数表示月份,从0-11(1月到12月)
dd:表示一个月中的第几天,从1到31
yyyy:四位数表示的年份
hh:小时数,从0(午夜)到23(晚11点)
mm:分钟数,从0到59的整数
ss:秒数,从0到59的整数
ms:毫秒数,为大于等于0的整数
如:
new Date("January 12,2006 22:19:35");
new Date("January 12,2006");
new Date(2006,0,12,22,19,35);
new Date(2006,0,12);
new Date(1137075575000);
Date() 返回当日的日期和时间。
getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getMonth() 从 Date 对象返回月份 (0 ~ 11)。
getFullYear() 从 Date 对象以四位数字返回年份。
getYear() 请使用 getFullYear() 方法代替。
getHours() 返回 Date 对象的小时 (0 ~ 23)。
getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。
getTime() 返回 1970 年 1 月 1 日至今的毫秒数。
getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差。
getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31)。
getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。
getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)。
getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份。
getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23)。
getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59)。
getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59)。
getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999)。
parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒数。
setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。
setMonth() 设置 Date 对象中月份 (0 ~ 11)。
setFullYear() 设置 Date 对象中的年份(四位数字)。
setYear() 请使用 setFullYear() 方法代替。
setHours() 设置 Date 对象中的小时 (0 ~ 23)。
setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。
setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。
setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。
setTime() 以毫秒设置 Date 对象。
setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。
setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。
setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)。
setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)。
setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)。
setUTCSeconds() 根据世界时设置 Date 对象中的秒钟 (0 ~ 59)。
setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)。
toSource() 返回该对象的源代码。
toString() 把 Date 对象转换为字符串。
toTimeString() 把 Date 对象的时间部分转换为字符串。
toDateString() 把 Date 对象的日期部分转换为字符串。
toGMTString() 请使用 toUTCString() 方法代替。
toUTCString() 根据世界时,把 Date 对象转换为字符串。
toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。
toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。
toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。
UTC() 根据世界时返回 1997 年 1 月 1 日 到指定日期的毫秒数。
valueOf() 返回 Date 对象的原始值。
对JavaScript中的Date格式化的扩展
方法一:这个很不错,好像是 csdn 的 Meizz 写的: