当前位置: 首页 > 编程日记 > 正文

js 实现精确加减乘除运算之BigDecimal.js

在前端实际开发中,进行前端计算会出现丢失精度的问题,这里我们项目中运用了BigDecimal.js。

js计算丢失精度原因

计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit。如图:

代表意义:1位用来表示符号位 11位用来表示指数 52位表示尾数

浮点数,比如

0.1 >> 0.0001 1001 1001 1001…(1001无限循环)
0.2 >> 0.0011 0011 0011 0011…(0011无限循环)
复制代码

此时只能模仿十进制进行四舍五入了,但是二进制只有 0 和 1 两个,于是变为 0 舍 1 入。这即是计算机中部分浮点数运算时出现误差,丢失精度的根本原因。

大整数的精度丢失和浮点数本质上是一样的,尾数位最大是 52 位,因此 JS 中能精准表示的最大整数是 Math.pow(2, 53),十进制即 9007199254740992。

大于 9007199254740992 的可能会丢失精度

9007199254740992     >> 10000000000000...000 // 共计 53 个 0
9007199254740992 + 1 >> 10000000000000...001 // 中间 52 个 0
9007199254740992 + 2 >> 10000000000000...010 // 中间 51 个 0
复制代码

实际上:

9007199254740992 + 1 // 丢失
9007199254740992 + 2 // 未丢失
9007199254740992 + 3 // 丢失
9007199254740992 + 4 // 未丢失
复制代码

解决方案之BigDecimal.js[BigDecimal.js的用法]

加法(四舍五入保留两位小数)

new BigDecimal("2.555555").add(new BigDecimal("5.222222")).setScale(2, MathContext.ROUND_HALF_UP).toString();
复制代码

减法

new BigDecimal("2.40").subtract(new BigDecimal("2"))
复制代码

乘法

new BigDecimal("2.40").multiply(new BigDecimal("2"))
复制代码

除法

new BigDecimal("2.40").divide(new BigDecimal("2"), def)
复制代码

这里只是项目总结以及分享,BigDecimal.js需要大家自行下载

转载于:https://juejin.im/post/5c1b3132e51d4550442a32f4

相关文章:

【ACM】杭电OJ 2012。

题目链接&#xff1a;杭电OJ 2012 思路很简单&#xff0c;但是有一种高效算法显示编译错误&#xff0c;不知道为什么 运行环境&#xff1a;VS2017 AC代码&#xff1a; #include <stdio.h> #include <math.h>int main() {int x, y, i,j,num,count,t;while (scan…

ubuntu配置jdk环境

1.下载jdk&#xff0c;解压 2.配置 ~/.bashrc&#xff0c;添加jdk路径 3.重启系统 4.当看到java -version有输出时&#xff0c;配置系统的默认java变量(默认jdk) sudo update-alternatives --install /usr/bin/java java /home/liweigao/software/jdk1.7.0_17/bin/java 300 …

解决 The mysql extension is deprecated and will be r

为什么80%的码农都做不了架构师&#xff1f;>>> 解决 The mysql extension is deprecated and will be removed in the future技术 maybe yes 发表于2015-07-27 15:19 原文链接 : http://blog.lmlphp.com/archives/132/Tutorial_of_solve_mysql_extension_is_depre…

Android控件系统(三)——Window与WindowMananger

Android版本&#xff1a;7.0(API27) [TOC] 澄清几个概念 窗口&#xff08;不是指的Window类&#xff09;&#xff1a;这是一个纯语义的说法&#xff0c;即程序员所看到的屏幕上的某个独立的界面&#xff0c;比如一个带有Title Bar的Activity界面、一个对话框、一个Menu菜单等&a…

Restore Volume 操作 - 每天5分钟玩转 OpenStack(60)

前面我们 backup 了 voluem&#xff0c;今天我们将讨论如何 restore volume。 restore 的过程其实很简单&#xff0c;两步走&#xff1a; 在存储节点上创建一个空白 volume。 将 backup 的数据 copy 到空白 voluem 上。 下面我们来看 restore 操作的详细流程&#xff1a; …

gdb 查找动态库方法

当GDB无法显示so动态库的信息或者显示信息有误时&#xff0c;通常是由于库搜索路径错误导致的&#xff0c;可使用set sysroot、set solib-absolute-prefix、set solib-search-path来指定库搜索路径。 1. set sysroot 与 set solib-absolute-prefix 是同一条命令&#xff0c;实…

【ACM】杭电OJ 1004

题目链接&#xff1a;杭电OJ 1004 运行环境&#xff1a;Dev-C 5.11 思路&#xff1a; 先把先把num数组全部赋值为1&#xff1b;第一个颜色单独输入&#xff0c;从第二个开始&#xff0c;需要与前面的进行比较&#xff0c;如果前面有相同的颜色&#xff0c;则在目前的num[i]上…

zabbix 监控mysql(实例)

修改zabbix_agentd.conf UnsafeUserParameters1 UserParametermysql.version,mysql -V UserParametermysql.status[*],/usr/local/zabbix/share/zabbix/alertscripts/chk_mysql.sh $1 UserParametermysql.ping,mysqladmin ping | grep -c alive 设置mysql的链接 ln -s /data/my…

linux查看系统版本信息命令

几种查看Linux版本信息的方法&#xff1a; 1. uname -a 2. cat /proc/version 3. cat /etc/issue 4. lsb_release -a 详解 lsb_release -a 登录到服务器执行 lsb_release -a &#xff0c;即可列出所有版本信息&#xff0c;例如&#xff1a; 1. [root3.5.5Biz-46 ~]# lsb_releas…

【ACM】杭电OJ 1005

题目链接&#xff1a;杭电OJ 1005 超时代码如下&#xff08;而且开辟的数组空间大小不够&#xff09;: #include <stdio.h> int m[100000]; int f(int n,int a,int b) {m[1] 1;m[2] 1;for (int i 3; i < n; i){m[i] (a * m[i - 1] b * m[i - 2]) % 7;}return …

PostgreSQL:Java使用CopyManager实现客户端文件COPY导入

在MySQL中&#xff0c;可以使用LOAD DATA INFILE和LOAD DATA LOCAL INFILE两种方式导入文本文件中的数据到数据库表中&#xff0c;速度非常快。其中LOAD DATA INFILE使用的文件要位于MySQL所在服务器上&#xff0c;LOAD DATA LOCAL INFILE则使用的是客户端的文件。 LOAD DATA I…

c, c++函数名编译符号修饰符说明

C 编译器的函数名修饰规则 函数名字修饰&#xff08;Decorated Name&#xff09;方式 函数的名字修饰&#xff08;Decorated Name&#xff09;就是编译器在编译期间创建的一个字符串。用来指明函数的定义或原型。 LINK程序或其它工具有时须要指定函数的名字修饰来定位函数的正确…

VS Code - Debugger for Chrome调试JavaScript的两种方式

VS Code - Debugger for Chrome调试JavaScript的两种方式 最近由于出差的缘故&#xff0c;博客写的不是很多&#xff0c;一直想写一篇VS Code - Debugger for Chrome相关的文章&#xff0c;没想到一直拖到了今天。VS Code 开源以后确实在社区得到了很多人的支持&#xff0c;当中…

【ACM】杭电OJ 2018

题目链接&#xff1a;杭电OJ 2018 从n>4开始&#xff0c;每一年的牛的数量前一年的牛的数量三年前的牛的数量 问&#xff1a;为什么是三年前&#xff1f; 答&#xff1a;假设三年前有一头小牛出生&#xff0c;出生的那一年即为第一年&#xff0c;到了第四年&#xff0c;即…

python 帮助文档、自我解释

现在让我们以交互方式使用 Python 来开始研究。当我们从命令行启动 Python 时&#xff0c;就进入了 Python shell&#xff0c;在这里可以输入 Python 代码&#xff0c;而且立刻会从 Python 解释器获得响应。 清单 1. 以交互方式启动 Python 解释器 Python 2.7.15rc1 (default, …

RCF远程调用框架

介绍 RCF&#xff08;远程调用框架&#xff09;是一个C IPC框架&#xff0c;提供了一种在C 程序中实现进程间通信的简单而一致的方法。它基于强类型的客户端/服务器接口的概念&#xff0c;这是基于IDL的中间件&#xff08;如CORBA和DCOM&#xff09;的用户熟悉的概念。然而&am…

Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习

#codingutf-8 __author__ Administrator#Python变量类型#Python数字&#xff0c;python支持四种不同的数据类型 int整型 long长整型 float浮点型 complex复数 var1 10; #表示整型 var2 678L #表示长整型 var3 12.34;#表示浮点型 var4 123j #复数 var5 12345j #复数print(…

【ACM】杭电OJ 2020(排序)

题目链接&#xff1a;杭电OJ 2020 排序可以有冒泡排序&#xff0c;选择排序&#xff0c;或者直接调用函数。 下面是选择排序&#xff1a; #include <stdio.h> #include <math.h> int main () {int n,i,j,t,a[100],temp;while(scanf("%d",&n)!EOF)…

使用Novell.Directory.Ldap.NETStandard在.NET Core中验证AD域账号

Novell.Directory.Ldap.NETStandard是一个在.NET Core中&#xff0c;既支持Windows平台&#xff0c;又支持Linux平台&#xff0c;进行Windows AD域操作的Nuget包。 首先我们新建一个.NET Core控制台项目&#xff1a;NetCoreLdap&#xff0c;并下载如下Nuget包&#xff1a; Nove…

android AIDL IPC深入分析

深入分析AIDL原理 博客分类&#xff1a; Android 在上一篇文章&#xff08;Service使用方式&#xff09;中&#xff0c;介绍了Android进程间通信&#xff08;IPC&#xff09;的使用&#xff0c;并给出了一个示例。但并没有深入分析aidl是怎样可以做到进程间通信的&#xff0c;…

xml常用操作(js、sql、vb)

我们经常会用到xml操作&#xff0c;如下介绍了js、sql、vb等对xml的操作。 JS创建xml对象 //创建对象 function getDataXML() {var objTds $("TEXTAREA");var count objTds.length;var jsonData;var xmlDoc new ActiveXObject("Microsoft.XMLDOM");//创…

【ACM】杭电OJ 2019

可以用链表写&#xff0c;也可以用顺序表写&#xff1a; 下面是链表的AC代码&#xff1a; #include <stdio.h> #include <stdlib.h> typedef struct node {int info;struct node* next; }N; N* init() {return NULL; } N* creat(N* head,int n) {int i,x;N *p, *…

Nancy in .Net Core学习笔记 - 初识Nancy

原文:Nancy in .Net Core学习笔记 - 初识Nancy前言 去年11月份参加了青岛MVP线下活动&#xff0c;会上老MVP衣明志介绍了Nancy, 一直没有系统的学习一下&#xff0c;最近正好有空&#xff0c;就结合.NET Core学习总结了一下。 注&#xff1a; 本文中大部分内容都是对官网文档的…

rpath和runpath的区别

考虑翻译Qt官方blog中的RPATH and RUNPATH这篇文章&#xff0c;在继续之前&#xff0c;我需要先验证自己的理解是正确的&#xff0c;至少能自圆其说&#xff0c;能说服自己。 用例子说话 二进制 对应源码 有一个程序 a.out main.c 需要加载插件A libA.so liba…

scanf(%s,a)和gets(a)的差别

gets()和scanf()的区别在于输入的字符串是否中间有空格&#xff1a;对于前者&#xff0c;只有遇到"\n"时才停止输入&#xff0c;而对于后者&#xff0c;出现"\n"或空格都停止输入。

阿里注册中心nacos使用整合Dubbo-原创

阿里注册中心nacos是今年开源的框架&#xff0c;一开始以为就是个zk。后面看了图才明白他对标的竟然是consul\eureka&#xff0c;最重要是完美支持dubbo。我想今年开源它也是别有用意 。&#xff08;目前nacos0.7版本&#xff09; Dubbo 融合 Nacos 成为注册中心 Nacos 作为 Du…

UBUNTU adb连接android设备

1sudo vi /etc/udev/rules.d/70-android.rules 2最新修改方法&#xff0c;不用去看设备的ID&#xff0c;直接在rules.d下增加一个文件51-android.rules&#xff0c;内容为&#xff1a; SUBSYSTEM"usb" ENV{DEVTYPE}"usb_device", MODE"0666" …

jetty9请求form表单太小限制

报错&#xff1a;java.lang.IllegalStateException: Form too large: 201975 > 200000解决&#xff1a;vi jetty.xml<Configure id"Server" class"org.eclipse.jetty.server.Server">在Server这行下面增加以下代码<!-- guowang add --><…

【ACM】杭电OJ 2037

题目链接&#xff1a;杭电OJ 2037 先把b[i]进行排序&#xff0c;然后&#xff0c;b[i]与a[i1]进行比较。 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <set> #include <…

第二十章:异步和文件I/O.(十三)

通过该开销&#xff0c;可以开始实际编写应用程序。 TextFileAsyncPage的XAML文件与TextFileTryoutPage相同&#xff0c;但必须将代码隐藏文件设置为使用异步文件I / O方法。 必须在此处捕获文件I / O函数中可能发生的任何异常&#xff0c;这意味着任何可以抛出异常的方法必须与…