我们有一个高度复杂的金融模型应用,涉及资金和百分比.它是用C#编写的,我们使用它的decimal类型来表示两者.它运行得很好,但我们正试图将这款应用程序移植到Java上,以摆脱微软.

令我惊讶的是,没有找到任何Java原生类型来存储金钱和百分比,两者都提供:

  1. 无损精度
  2. 本机风格的计算(例如,使用+而不是.add()进行加法)

我知道大家的共识是使用BigDecimal.这解决了存储部分,但使用它进行计算非常麻烦.例如,用decimal代替这个:

((a + b + c + d) / e) * f

如果是BigDecimal分,我得这么做:

a.add(b).add(c).add(d).divide(e).multiply(f)

这对于少量的计算来说是很好的,但我们有数千次计算,他们的一些公式有几十行.这很快就变得笨拙和难以阅读.

基本上,我正在寻找的正是C#的S decimal类型的Java复制品.

推荐答案

与例如在Kotlin中不同,这在Java中是不可能的,因为该语言既不允许操作符重载,也不允许插入函数.

你必须选一个:

  1. double:保持可读性,但失go 精确度.
  2. Bigdecimal:保持精度,但失go 可读性.

如果你设法切换到Kotlin,你可以使用BigDecimal Kotlin extension的强大功能.

Java相关问答推荐

获取拦截器内部的IP地址

当列顺序更改时,Table View列列表的Change. wasPermanted()总是返回假

查找最大子数组的和

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

使用动态ID从json获取详细信息的Jolt规范

现场观看Android Studio中的变化

Spring Data JPA慢慢地创建了太多非活动会话

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

Javadoc在方法摘要中省略方法

使用Jolt将字段转换为列表

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

如何在Cosmos DB(Java SDK)中增加默认响应大小

如何将Pane的图像快照保存为BMP?

JNI:将代码打包成自包含的二进制文件

FETCH类型设置为LAZY,但它仍会发送第二个请求

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

我的代码是线程安全的吗?[Java、CAS、转账]

我们可以在方法中声明接口吗?

谷歌应用引擎本地服务器赢得';t在eclipse上运行

使用Java线程进行并行编程