我正在使用Java 6设计一个工具,它将从医疗设备中读取数据。
每个医疗设备制造商都实施自己的固件/协议。供应商(像我一样)编写自己的界面 使用制造商的固件命令从医疗设备获取数据。大多数固件会以神秘的方式输出数据,因此接收它的供应商应该通过对其进行一些计算来对其进行扩展,以便计算出真实值。
可以安全地假设医疗数据的精确度与财务数据的精确度等同等重要。
我得出结论,使用BigDecimal进行所有数值计算并存储最终值。我几乎每秒都会收到一组新的数据,这意味着,我将每秒进行计算并更新相同的值集。示例:每次呼吸时来自呼吸机的数据。
由于BigDecimal是不可变的,我担心每秒在堆中生成的对象数。特别是因为该工具必须扩展以同时从50个设备中读取数据。
我可以增加堆大小和所有这些,但仍然是我的问题......
问题
我可以使用BigDecimal的可变表兄吗?
是否有任何现有的开源框架可以做这样的事情?
Java是否是这种功能的正确语言?
我应该看看Apfloat吗?但Apfloat也是不可改变的。 JScience怎么样?
任何Java数学库我都可以用于高精度
我的目标是精度高达10位数。不需要更多。那么这种精度的最佳库或行动方案是什么?
答案 0 :(得分:2)
我建议您在得出BigDecimal不适合您的需求的结论之前,实际上是在描述您的场景。不可改变的性质会对您的情景产生重大影响,这已不是定局。现代JVM非常擅长分配和销毁大量对象。
答案 1 :(得分:0)
如果你只需要10位数的精度,你可以简单地使用一个精度为16 digits的双精度。
答案 2 :(得分:0)
double
基元类型提供大约16位十进制精度,为什么不使用它?然后你根本不会碰到堆。
答案 3 :(得分:0)
你具体说你只需要10位有效数字。你没有说你是在考虑二进制或十进制数字,但是标准的64位IEEE浮点数(Java double)提供52个二进制数字(大约16个十进制数字),听起来它不仅仅满足你的需求。
但是,我建议您考虑一下您应用于输入数字的任何操作的数值稳定性。例如,Math.log()和Math.exp()可能会有意想不到的效果,具体取决于输入的范围(在某些情况下,您可能会发现Math.log1p()和Math.exp1m()更合适,但再次 - 这取决于你正在执行的具体操作。)
答案 4 :(得分:0)
垃圾收集器应该做一个足够好的清理对象的工作,但是如果你仍然想要不可变的数字,你总是可以使用反射访问BigDecimal的反向数据,这样你就可以为BigDecimal创建一个包装类做你想做的事。