先放个前辈的文章:JavaScript数字精度丢失问题总结

今天遇到了19.99*100的问题,答案不等于1999,因为在javascript中浮点数的计算是以2进制计算的。自己写了一波解决方法(不能单纯的乘Math.pow(10,N)变成整数运算完再除掉,因为乘也会有精度问题,就像题面19.99*100不等于1999。):

  1. function formatFloat(num1,num2){
  2. var str1 = num1.toString();
  3. var str2 = num2.toString();
  4. var c1 = str1.lastIndexOf(".")==-1?0:str1.lastIndexOf(".");
  5. var c2 = str2.lastIndexOf(".")==-1?0:str2.lastIndexOf(".");
  6. var n1 = str1.replace('.','');
  7. var n2 = str2.replace('.','');
  8. console.log(n1,n2);
  9. return parseInt(n1)*parseInt(n2)/Math.pow(10,c1+c2);
  10. }
  11. console.log(formatFloat(19.99,100));

这里把小数变整数的方法是用字符串方法去掉小数点。

然后上网一查,自己的方法其实早就有啦,而且网上的更全面,所以摘抄下来一个备用:

  1. /**
  2. * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。
  3. *
  4. * @param num1加数1 | num2加数2
  5. */
  6. function numAdd(num1, num2) {
  7. var baseNum, baseNum1, baseNum2;
  8. try {
  9. baseNum1 = num1.toString().split(".")[1].length;
  10. } catch (e) {
  11. baseNum1 = 0;
  12. }
  13. try {
  14. baseNum2 = num2.toString().split(".")[1].length;
  15. } catch (e) {
  16. baseNum2 = 0;
  17. }
  18. baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
  19. return (num1 * baseNum + num2 * baseNum) / baseNum;
  20. };
  21. /**
  22. * 加法运算,避免数据相减小数点后产生多位数和计算精度损失。
  23. *
  24. * @param num1被减数 | num2减数
  25. */
  26. function numSub(num1, num2) {
  27. var baseNum, baseNum1, baseNum2;
  28. var precision;// 精度
  29. try {
  30. baseNum1 = num1.toString().split(".")[1].length;
  31. } catch (e) {
  32. baseNum1 = 0;
  33. }
  34. try {
  35. baseNum2 = num2.toString().split(".")[1].length;
  36. } catch (e) {
  37. baseNum2 = 0;
  38. }
  39. baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
  40. precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
  41. return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);
  42. };
  43. /**
  44. * 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。
  45. *
  46. * @param num1被乘数 | num2乘数
  47. */
  48. function numMulti(num1, num2) {
  49. var baseNum = 0;
  50. try {
  51. baseNum += num1.toString().split(".")[1].length;
  52. } catch (e) {
  53. }
  54. try {
  55. baseNum += num2.toString().split(".")[1].length;
  56. } catch (e) {
  57. }
  58. return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
  59. };
  60. /**
  61. * 除法运算,避免数据相除小数点后产生多位数和计算精度损失。
  62. *
  63. * @param num1被除数 | num2除数
  64. */
  65. function numDiv(num1, num2) {
  66. var baseNum1 = 0, baseNum2 = 0;
  67. var baseNum3, baseNum4;
  68. try {
  69. baseNum1 = num1.toString().split(".")[1].length;
  70. } catch (e) {
  71. baseNum1 = 0;
  72. }
  73. try {
  74. baseNum2 = num2.toString().split(".")[1].length;
  75. } catch (e) {
  76. baseNum2 = 0;
  77. }
  78. with (Math) {
  79. baseNum3 = Number(num1.toString().replace(".", ""));
  80. baseNum4 = Number(num2.toString().replace(".", ""));
  81. return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
  82. }
  83. };

js float运算精度问题的更多相关文章

  1. Java使用BigDecimal保留double、float运算精度、保留指定位数有效数字、四舍五入

    工具类 package --; import java.math.BigDecimal; /** * Created by kongqw on 2015/12/10. */ public final ...

  2. js浮点数运算精度问题

    https://www.cnblogs.com/yadongliang/p/9067333.html

  3. 搞懂js中小数运算精度问题原因及解决办法

    js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型. number类 ...

  4. 关于java中Double类型的运算精度问题

    标题     在Java中实现浮点数的精确计算    AYellow(原作) 修改    关键字     Java 浮点数 精确计算   问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...

  5. 关于java中Double类型的运算精度问题(转)

    Java Java double:浮点数:精确计算  public class Test{    public static void main(String args[]){        Syst ...

  6. js & float number bug

    js & float number bug 前端最好不要处理任何的 float number 的计算/精确度转换的操作,不热很容易丢失精度,显示错误! 前端显示个 0.0 都很费劲,最好的方式 ...

  7. js赋值运算的理解

    简介 js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用 ps:直接量:直接值数字字符串等 为什么使用len = doms.length; 里的len效率要比 ...

  8. #define与运算精度问题探究

    #include <stdio.h> #define SQR(X) X*X int main(int argc, char* argv[]) { ; ; ; printf("SQ ...

  9. JS浮点数运算Bug

    JS浮点数运算Bug的解决办法(转) 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.0849999 ...

随机推荐

  1. crunch创建自己的密码字典文件

    http://www.2cto.com/article/201608/542026.html

  2. crc循环冗余检验

    CRC(Cyclic Redundancy Check):循环冗余检验.在链路层被广泛使用的检错技术. CRC原理: 1.发送端 1.1.在发送端先将数据分组,每组k个数据.假定要传送的数据是M. 1 ...

  3. 029 c3p0的小测试

    今天被问到这个问题,就实验了一下,后续会继续补充一些配置项的意思. 一:操作步骤 1.大纲 2.新建sql -- ---------------------------- -- Table struc ...

  4. Windows 下安装 Ubuntu 双系统(更新)

    Windows + Ubuntu 16.04 ---> 双系统 前言:本篇文章是对之前文章的更新,更新的主内容是把原来用手机拍摄的图片换成了虚拟机的截图,以及对磁盘划分的新的见解和一些使用感受, ...

  5. Spring日记_02之 json、javaBean、.do、MySql、MyBatis 环境搭建结束

    JSON Json是JavaScript直接量语法 无参构造方法直接 Alt + \ 就可以提示添加 Project – Clean 浏览器向服务器发送请求,服务器中的Spring中的SpringMV ...

  6. Python 解决 :NameError: name 'reload' is not defined 问题

    对于 Python 2.X: import sys reload(sys) sys.setdefaultencoding("utf-8") 1 2 3 对于 <= Pytho ...

  7. python2.7安装和uwsgi

    python2.7安装和uwsgi tar zxf Python-2.7.13xxxx# 这里,必须用–enable-shared,生成动态库,否则会遇到wsgi不能编译的问题. Bonus: mul ...

  8. hdu1598 find the most comfortable road (枚举)+【并查集】

    <题目链接> 题目大意: XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在 ...

  9. Effective前端1---chapter 2 用CSS画一个三角形

    1.CSS画三角形的画法 第一步:三角形可以用border画出来,首先一个有四个border的div长这样: <div class="triangle"></di ...

  10. vue注册和简单使用

      组件的出现就是为了解决页面布局等等一些列的问题. vue中的组件分为两种,全局组件和局部组件. 一  . 注册全局组件 通过Vue.component()创建一个全局组件之后,我们可以在一个通过  ...