文档章节

一个解决js浮点运算精度的代码

开源中国首席劝架师
 开源中国首席劝架师
发布于 2018/02/01 11:05
字数 367
阅读 5.5K
收藏 46

行业解决方案、产品招募中!想赚钱就来传!>>>

比市面上很多解决方案都要准确的方案^_^

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  操作数1:<input id="a">
  操作数2:<input id="b">
  <button>加</button>
  <button>减</button>
  <button>乘</button>
  <button>除</button>
  结果:<span id="result"></span>
  <script>
// 补0
function padding0 (p) {
  var z = ''
  while (p--) {
    z += '0'
  }
  return z
}

/**
 * 解决小数精度问题
 * @param {*数字} a
 * @param {*数字} b
 * @param {*符号} sign
 * fixedFloat(0.3, 0.2, '-')
 */
function fixedFloat (a, b, sign) {
  function handle (x) {
    var y = String(x)
    var p = y.lastIndexOf('.')
    if (p === -1) {
      return [y, 0]
    } else {
      return [y.replace('.', ''), y.length - p - 1]
    }
  }
  // v 操作数1, w 操作数2, s 操作符, t 精度
  function operate (v, w, s, t) {
    switch (s) {
      case '+': return (v + w) / t
      case '-': return (v - w) / t
      case '*': return (v * w) / (t * t)
      case '/': return (v / w)
    }
  }

  var c = handle(a)
  var d = handle(b)
  var k = 0

  if (c[1] === 0 && d[1] === 0) {
    return operate(+c[0], +d[0], sign, 1)
  } else {
    k = Math.pow(10, Math.max(c[1], d[1]))
    if (c[1] !== d[1]) {
      if (c[1] > d[1]) {
        d[0] += padding0(c[1] - d[1])
      } else {
        c[0] += padding0(d[1] - c[1])
      }
    }
    return operate(+c[0], +d[0], sign, k)
  }
}
// 加
function plus (a, b) {
  return fixedFloat(a, b, '+')
}
// 减
function minus (a, b) {
  return fixedFloat(a, b, '-')
}
// 乘
function multiply (a, b) {
  return fixedFloat(a, b, '*')
}
// 除
function division (a, b) {
  return fixedFloat(a, b, '/')
}
  </script>

  <script>
  // 操作部分
  var a = document.getElementById('a')
  var b = document.getElementById('b')
  var result = document.getElementById('result')
  document.addEventListener('click', function (e) {
    if (e.target.nodeName === 'BUTTON') {
      var v = 0
      switch (e.target.innerText) {
        case '加': result.innerText = plus(a.value, b.value)
          break
        case '减': result.innerText = minus(a.value, b.value)
          break
        case '乘': result.innerText = multiply(a.value, b.value)
          break
        case '除': result.innerText = division(a.value, b.value)
          break
      }
    }
  })
  </script>
</body>
</html>
开源中国首席劝架师

开源中国首席劝架师

粉丝 58
博文 21
码字总数 20303
作品 4
广州
高级程序员
私信 提问
加载中
此博客有 2 条评论,请先登录后再查看。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
CSS Browser Selector

CSS Browser Selector 是一个小的 JS 库,可增强 CSS 的选择器功能,支持根据不同的操作系统和浏览器来编写指定的 CSS 代码,可检测浏览器、浏览器版本、平台、平台版本、设备、设备版本、m...

匿名
2013/01/17
2.8K
1
在多个浏览器上运行脚本--Queen

假设你想和朋友们玩这么个游戏:你写下某个数字,然后让朋友们猜你写的是什么数字。你的朋友们将不断的给你一些猜测的数字,直到猜中为止。 现在想象你的朋友都是使用的浏览器,这个游戏就相...

匿名
2013/01/24
4.5K
1

没有更多内容

加载失败,请刷新页面

加载更多

搞网站的你,不了解一下共享虚拟主机和备案问题

正文共:1474字 14图,预估阅读时间:4 分钟 今天分享的这一切要从域名备案说起。先科普一下,平时我们访问网站都是用域名访问的,通过DNS服务器将域名解析为IP地址(你知道上网时输入的URL...

郭松成
昨天
0
0
10 分钟学会 pillow 图像处理 16 式

PIL:Python Imaging Library,是Python环境下最受欢迎的图像处理库之一。 pillow简单优雅而功能强大,是图像相关机器学习任务中算法工程师的亲密合作伙伴。 我们将介绍pillow的如下16个图片...

zglg
昨天
0
0
3大排行榜告诉你,Java&Python有多稳

什么编程语言最受欢迎? 零基础小白学什么语言最好找工作? …… 关于这些问题的讨论从来都没停止 今天领扣🐱就来盘点一下 如今最受欢迎的语言到底是什么 Java&Python学习大礼包 资料领取方...

Lintcode
今天
2
0
这道原题答出来了还是跪!今年面试也太难了……

秋招已然到来,Amazon这不又发了一堆岗位,此时可以说是上岸最好机会!不过上周有同学反馈面试亚麻,遇到一题曾经刷过,惨的是最后还是跪了,班班仔细一问原来是这道。 给定一个整数序列,找...

九章算法
今天
0
0
【你只需看一次】YOLO 全系列目标检测算法

文章目录 一、概述 二、Yolo系列全家桶 YOLOv1 开山鼻祖之作 YOLOv2 YOLOv3 YOLOv4 目标检测tricks集大成者 YOLOv5 Fast YOLO Complex-YOLO MV-YOLO YOLO3D YOLO-6D YOLO-LITE Spiking-YOLO ......

osc_5p8bxoq2
10分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部