首页 > 其他分享 >处理区块链中大数的转化,显示整数部分使用千分位,保留精度

处理区块链中大数的转化,显示整数部分使用千分位,保留精度

时间:2022-12-27 15:56:03浏览次数:40  
标签:index return val 千分 start num let 链中 区块

在我们写区块链中常遇到后端返回的非常大的数字,需要前端处理显示,一开始我们使用数字直接除以18个0,会发现在整除的时候会莫名的出现一堆长的数字丢失了相应的精度。是因为浮点数值的最高进度是17位小数。
我们可以使用ethers自带的utils中的大数处理方法来做,在js文件中写一些公共的方法
import {utils} from 'ethers'
// 去除多余的0 最多保留小数点后4位有效数字,不四舍五入
export function effective(val) {
    if (!val) return val;
    val = String(val);
    let dot = val.includes(".");
    if (val == '0' || val === "undefined") {
        return "0";
    } else if (dot) {
        let num = 0;
        let start = 0;
        let array = val.split(".")[1].split("");
        for (let index = 0; index < array.length; index++) {
            if (array[index] > '0' && start == 0) {
                start = index + 1;
            }
            if (array[index] > '0') {
                num = index + 1;
            }
        }
        let fixe = 0;
        if (num - start >= 3) {
            fixe = start + 3;
        } else {
            fixe = num - start + 1;
        }
        if (num >= 2 && num - start < 3) {
            fixe = num * 2 - start - 1
        }
        if (num == start) {
            fixe = num;
        }
        if (fixe == 0) {
            return val.split(".")[0]
        } else {
            let tempVal = val.slice(0, fixe + val.split(".")[0].length + 1);
            return parseFloat(tempVal); //去除尾部多余的0 
        }
    } else {
        return val;
    }
}

export function addThousandthSign(numStr) { //处理数字的千分
    let regForm = /(\d{1,3})(?=(\d{3})+(?:$|\.))/g; //小数点也分千分位
    numStr = String(numStr);
    if (numStr.includes('.')) {
        let num = numStr.split('.')[0];
        let dotNum = numStr.split('.')[1];
        let resultStr = num.toString().replace(regForm, "$1,");
        return `${resultStr}.${dotNum}`;
    } else {
        return numStr.toString().replace(regForm, "$1,")
    }
    
}

export function changE(str) {//将String 大数后带e的转成不带e的字符串
    let num = str.split('e')[0];
    let deci = str.split('+')[1];
    return utils.formatUnits(utils.parseUnits(num, deci), 18)
}

export function getResultData(val) {
    var valStr = String(val);//当数字过大时转换会出现e小数点精度最多保留14位最后一位四舍五入但是一般也够用了
    var tempStr = valStr.includes('e') ? changE(valStr) : utils.formatUnits(valStr, 18);
    return addThousandthSign(effective(tempStr));
}

然后在页面中引入 getResultData 函数直接把大数传过去就可以得到对应的值了

import {getResultData} from '@/utils/index.js'
methods: {
    getResultData(val){
    return getResultData(val);
    },
    getData() {
         this.getResultData(97825000000000000000000) //97,825
         this.getResultData(97825435960000000000000)//97,825.4359
     }
} 

标签:index,return,val,千分,start,num,let,链中,区块
From: https://www.cnblogs.com/ximenchuifa/p/17008241.html

相关文章

  • Web前端——HTML中的区块布局
    文章目录​​一.CSS的元素显示模式​​​​二.HTML的区块元素和内联元素​​​​1.块元素​​​​2.行内元素​​​​3.行内块元素​​​​4.元素显示模式转换​​​......
  • 区块链链上交易与链下交易,有什么区别?
    摘要:区块链技术为链上交易提供了安全、开放的解决方案。对于寻求速度、匿名性和成本效益的用户来说,进行链下交易可能是有意义的。区块链技术可用于促进加密货币交易,而......
  • 新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)
    区块链去中心化思想无处不在,比如最近使用个体抗原自检替代大规模的中心化核酸检测,就是去中心化思想的落地实践,避免了大规模聚集导致的交叉感染,提高了检测效率,本次我们使用E......
  • 区块链1 区块链简介,以太坊介绍及安装环境
    区块链1:区块链简介,以太坊介绍及安装环境1.1区块链概述区块链不是一个单独的技术,而是有多种技术组成的技术栈。区块链的四个特性:分布式数据库,每个节点是对等的密码学......
  • 这破玩意就是区块链?
    ethtron快速入门这破玩意就是区块链?@目录历史前提区块链节点那么如何搭建自己的区块链节点呢?全节点搭建命令参数解析轻节点搭建数据模型MPT区块结构案例最后参考web3.......
  • GO语言凭什么是区块链的首选语言
    GO语言凭什么是区块链的首选语言区块链的火热也带动了GO语言开发者的突增,那凭什么GO语言会成为最主要的区块链构建语言之一。我认为这得益于GO语言的性能、抽象度、简单性......
  • Docker安装FISCO BCOS区块链平台
    2.0版本提供docker镜像,支持容器化部署,省去了很多编译安装过程遇到的各种问题。FISCOBCOS官方镜像docker地址:https://hub.docker.com/r/fiscoorg/fiscobcos/builds  我......
  • 区块链,中心去,何曾着眼看君王?用Go语言实现区块链技术,通过Golang秒懂区块链
    区块链技术并不是什么高级概念,它并不比量子力学、泡利不相容原则、哥德巴赫猜想更难以理解,但却也不是什么类似“时间就是金钱”这种妇孺皆知的浅显道理。区块链其实是一套......
  • 区块链技术和DeFi,在去中心化使命中发挥关键作用!
       在传统的金融观念中,流动性在整个经济金融体系中的重要性不言而喻,甚至可以说现代金融交易体系甚至整个货币体系,都是在为更好的提升市场交易的流动性,而在不断演变和......
  • 区块链相关理解整理
    对于区块链,有人视之为宝物,有人视之为妖魔。那么它到底是否是很重要,甚至是可以产生重大影响的技术呢?比特币的出现已经证明了它可以带来重要影响了。那么它的作用只能是提......