我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何处理JavaScript 中的货币值?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何处理JavaScript 中的货币值?

金钱无处不在。

       无论在银行应用程序、电子商务网站还是证券交易所平台,我们每天都在与金钱互动。我们也越来越依赖技术来处理问题。

       然而,关于如何以编程处理货币价值尚无共识。虽然金钱是现代社会中普遍存在的概念,但相较于日期和时间之类的东西,它并不是任何主流语言中的一流数据类型。结果,每一种软件都有自己的处理方式,且伴随着陷阱。

陷阱#1:金钱是数字?

       当你需要代表钱时,你的第一直觉可能是使用一个数字。

       金钱只不过是一个数值,对吧?

       错了。

       货币价值的一部分与另一对象有关:货币。没有10“钱”,应该是“10美元,10欧元,10比特币”......如果你想用不同的货币添加两个货币值,你需要先转换它们。如果你想比较它们也是如此:如果你只有一个金额,你就无法进行准确的比较。金额和货币谁也离不开谁。

陷阱#2:让人烦恼的小数点

       大多数现代货币额都是以小数形式出现,或根本没有子单位。这意味着当货币有子单位时,主单位中这些单位的数量是10的幂。例如,一美元有100美分——10的2次幂。

       使用十进制系统具有优势,但在编程方面有一个问题。计算机使用二进制系统,因此它们不能原生地表示十进制数。有些语言提出了自己的解决方案,如Java中的BigDecimal类型或C#中的小数类型。JavaScript只有Number类型,可以用作整数或双精度浮点数。因为它是基础10系统的二进制表示,所以当你尝试进行数学运算时,最终会得到不准确的结果。

       使用浮点来存储货币价值是一个坏主意。

       当你计算更多值时,难以察觉的精度误差会导致更大的差异。这不可避免地导致最终的四舍五入问题。 

陷阱#3:百分比与分期

       有时你需要计算分期,但百分比总是或增加或减少付款数。

       想象一下,你需要支付999.99美元,首付50%。这可以通过一些简单的数学来完成。一半是499.995美元,但是你不能再分一分钱,所以你可能会把结果分成500美元。问题是,当你付尾款时,你最终会获得相同的结果并且额外付一分钱。

       分期有时候会遇到除不尽的情况。天然气价格可能显示超过两位数,但它只是象征性的:你最终总是支付一个四舍五入的价格。

编程人员应该怎么办?

       幸运的是,软件工程师Martin Fowler提出了一个解决方案。在企业应用程序架构模式中,他描述了货币价值的模式:

属性

方法

数学:加,减,乘,除

比较:等于,大于,大于或等于,小于,小于或等于。

       由此,你可以创建满足大部分货币需求的价值对象。

“金额+货币”作为数据结构

       金钱的行为与简单的数字不同,因此应区别对待。第一个也是最重要的是:它应该始终由金额和货币组成。

       你可以将货币金额一起添加,检查它们的值是否相对应,并将它们格式化为你需要的任何内容。这可以通过对象的方法完成。在JavaScript中,任何返回对象的函数都可以解决问题。

以美分计额

       有几种方法可以解决JavaScript中的浮点问题。

       你可以使用像Decimal.js这样的库来将浮点数作为字符串。这不是一个糟糕的解决方案,当你必须处理大数字时,它会派上用场。然而,它以增重依赖性为代价,导致性能降低。

       你可以在计算之前将浮点数乘以整数,然后将它们分开。

如何处理JavaScript 中的货币值?

       这是一个很好的解决方案,但需要在对象构造或每次操作时进行额外的计算。这不一定会影响性能,但仍然需要更多的流程工作。

       第三种方法是直接以美分为单位存储相对于单位的值。如果你需要存储10美分,则不会存储0.1,而是10.这允许你仅使用整数,这意味着安全计算(直到你遇到大数字)和出色的性能。

        如何处理JavaScript 中的货币值

       Dinero.js:一个用于创建、计算和格式化货币价值的不可变库

       从以上观察中,我创建了一个JavaScript库:Dinero.js。

如何处理JavaScript 中的货币值?

       Dinero.js遵循Fowler的模式更多一点儿。它允许你在JavaScript中创建、计算和格式化货币值。你可以进行数学运算、解析和格式化对象,甚至向他们提问,使你的开发过程更加轻松。

       该库设计为不可变和可链接的模式。它支持全局设置,具有扩展格式选项,并提供本机国际化支持。

为什么不可变?

       不可变库更安全,更好预测。可变操作和引用副本是许多错误的来源。选择不变性能够避免了这些错误。

       使用Dinero.js,你可以执行计算而无需担心更改原始用例。在以下Vue.js示例中,调用priceWithTax时不会更改Price。如果用例是可变的,它将会更改价格。

如何处理JavaScript 中的货币值?

可链接性

       优秀的开发人员努力使他们的代码更简洁,更易于阅读。当你想要在单个对象上连续执行多个操作时,链接提供了优雅的符号和简洁的语法。

如何处理JavaScript 中的货币值?

全球设置

       当你处理大量货币价值时,你可能希望其中一些人分享一些属性。如果你使用德语制作网站,你可能希望以德国货币格式显示金额。

       这是全球设置派上用场的地方。你可以声明将应用于所有新对象的选项,而不是将它们传递给每个用例。

如何处理JavaScript 中的货币值?

原生国际化支持

       传统意义上,库使用区域设置文件进行国际化。

如何处理JavaScript 中的货币值?

       区域设置文件也很难维护。Internationalization API是原生的,并且得到了很不错的支持。除非你必须使用过时的或不知名的浏览器,否则toFormat可以安全使用。

格式化

       对象很适合存储数据,但在显示数据时却没那么有用。Dinero.js提供了各种格式化方法,包括toFormat。它为Number.prototype.toLocaleString提供了直观而简洁的语法。将它与setLocale配对,你将能够以任何语言将任何Dinero对象显示为正确的格式。这对多语言电子商务网站特别有用。

接下来做什么?

       大家广泛认同Fowler模式是一个不错的解决方案。它激发了许多语言的同步实现。如果你正在DIY,我推荐它和本文的观察结果作为起点。或者你可以选择Dinero.js:一种现代,可靠,经过全面测试的解决方案,已经可以使用。

        

        

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何处理JavaScript 中的货币值?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何处理JavaScript 中的货币值?

金钱无处不在。 无论在银行应用程序、电子商务网站还是证券交易所平台,我们每天都在与金钱互动。我们也越来越依赖技术来处理问题。 然而,关于如何以编程处理货币价值尚无共识。虽然金钱是现代社会中普遍存在的概念,但相较于日期
2023-06-03

如何处理MySQL中的NULL值

在MySQL中,可以使用以下方法处理NULL值:检查NULL值:使用IS NULL或IS NOT NULL操作符来检查NULL值。例如,可以使用以下查询来检查一个列是否包含NULL值:SELECT *FROM table_nameWHE
如何处理MySQL中的NULL值
2024-04-09

SQLite中如何处理空值

在SQLite中处理空值的方式有以下几种:使用NULL值:在SQLite中,NULL值表示缺失或未知的值。可以将NULL值存储在表的列中,以表示该列中的值是空的。SQLite默认将NULL视为值,因此当插入数据时不提供值时,会自动插入NUL
SQLite中如何处理空值
2024-04-09

golang中如何处理空值?

php小编鱼仔为您介绍golang中如何处理空值。在golang中,空值通常表示变量没有被赋值或者没有有效的值。为了处理空值,golang提供了多种方法。首先,可以使用条件语句(if语句)来检查变量是否为nil。其次,可以使用默认值来初始化
golang中如何处理空值?
2024-02-12

MySQL中如何处理NULL值

在MySQL中,可以使用以下方式处理NULL值:使用IS NULL和IS NOT NULL操作符来判断NULL值:SELECT * FROM table_name WHERE column_name IS NULL;SELECT * FR
MySQL中如何处理NULL值
2024-03-06

如何处理 Golang 中的 nil 错误值?

在 go 中处理 nil 错误值有以下方法:显式检查错误,例如 if err == nil。使用 errors.is 和 errors.as 函数进行错误比较和类型转换。使用特定错误类型,如 os.patherror,访问更多信息。如何处理
如何处理 Golang 中的 nil 错误值?
2024-05-14

Keras中如何处理缺失值

在Keras中处理缺失值的方法取决于数据集的特点以及建模的方式。以下列举了一些处理缺失值的常见方法:将缺失值替换为固定值:可以将缺失值替换为特定的固定值,如平均值、中位数或众数。在Keras中可以使用SimpleImputer类来实现这一功
Keras中如何处理缺失值
2024-03-14

如何在MySQL中设计一个可扩展的会计系统表结构以支持多种货币和汇率处理?

如何在MySQL中设计一个可扩展的会计系统表结构以支持多种货币和汇率处理?随着全球经济的发展,越来越多的企业需要在其会计系统中处理多种货币和汇率。为了有效地支持这种需求,我们需要在数据库中设计一个可扩展的表结构。在MySQL中,我们可以通过
如何在MySQL中设计一个可扩展的会计系统表结构以支持多种货币和汇率处理?
2023-10-31

Kotlin语言中是如何处理null值的

Kotlin语言中是如何处理null值的?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Kotlin null的处理详解NullPointerException,
2023-05-31

javascript中如何处理空格符

今天小编给大家分享一下javascript中如何处理空格符的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在JavaScrip
2023-07-06

PHP中如何安全地处理MySQL中的0值?

PHP中如何安全地处理MySQL中的0值?在PHP开发中,经常会涉及到与MySQL数据库进行交互并处理各种数据。在处理数据库中的0值时,我们需要注意一些安全性的问题,以避免出现意外的情况。本文将介绍如何安全地处理MySQL中的0值,并提供
PHP中如何安全地处理MySQL中的0值?
2024-02-28

如何在Asp.Net Core MVC中处理null值的实现

译文链接:https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html 传统的 asp.net mvc 对应着 .ne
2022-06-07

springboot中如何利用fastjson处理返回值为null的属性值

本篇内容主要讲解“springboot中如何利用fastjson处理返回值为null的属性值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot中如何利用fastjson处理返回值
2023-06-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录