java标准财务软件,java – 使用Double进行财务软件

如果你绝对不能使用BigDecimal并且不想使用双精度数,那么使用long来做

fixed-point arithmetic(所以每个long值代表分数,例如).这将使你代表18位有效数字.

我会说使用joda-money,但这会使用BigDecimal.

编辑(因为上面没有真正回答问题):

免责声明:如果准确性对你很重要,请在don’t use double to represent money.但是看起来海报并不需要准确的准确性(这似乎是关于金融定价模型,可能有超过10 ** – 12内置的不确定性) ,更关心性能.假设是这种情况,使用double是可以原谅的.

通常,double不能精确地表示小数.那么,双重是多么不精确?对此没有简短的答案.

double可能能够很好地表示一个数字,你可以将数字读入一个double,然后再将其写回,保留15个十进制数字的精度.但由于它是二进制而不是小数,它不可能是精确的 – 它是我们希望表示的值,加上或减去一些错误.当执行涉及不精确双精度的许多算术运算时,该误差的量可能随着时间的推移而累积,使得最终乘积具有少于十五个十进制数字的精度.少了几个?那要看.

考虑以下函数,该函数采用1000的第n个根,然后将其自身乘以n次:

private static double errorDemo(int n) {

double r = Math.pow(1000.0, 1.0/n);

double result = 1.0;

for (int i = 0; i < n; i++) {

result *= r;

}

return 1000.0 - result;

}

结果如下:

errorDemo( 10) = -7.958078640513122E-13

errorDemo( 31) = 9.094947017729282E-13

errorDemo( 100) = 3.410605131648481E-13

errorDemo( 310) = -1.4210854715202004E-11

errorDemo( 1000) = -1.6370904631912708E-11

errorDemo( 3100) = 1.1107204045401886E-10

errorDemo( 10000) = -1.2255441106390208E-10

errorDemo( 31000) = 1.3799308362649754E-9

errorDemo( 100000) = 4.00075350626139E-9

errorDemo( 310000) = -3.100740286754444E-8

errorDemo(1000000) = -9.706695891509298E-9

请注意,累积不准确度的大小并不会与中间步骤的数量成正比地增加(实际上,它不是单调增加的).给定一系列已知的中间操作,我们可以确定不准确度的概率分布;虽然这将具有更宽的范围,但是更多的操作,确切的数量将取决于输入计算的数字.不确定性本身是不确定的!

根据您正在执行的计算类型,您可以通过在中间步骤之后舍入到整个单位/整分来控制此错误. (考虑一个银行账户持有100美元,每月6%的利息复合,每月0.5%的利息.在第三个月的利息被记入后,你想要余额是101.50美元还是101.51美元?)拥有双重支架对于分数单位(即分数)的数量而不是整数单位的数量会使这更容易 – 但如果你这样做,你也可以只使用我上面建议的多数.

免责声明:浮点错误的积累使得使用双倍数额的资金可能非常混乱.作为一个Java开发人员,他曾多次使用double来表示多年来对他的任何打击,我会使用十进制而不是浮点运算来计算任何涉及金钱的重要计算.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java家庭财务管理系统是一种基于Java Web和MySQL的应用程序,旨在帮助用户管理家庭财务。以下是一个基于Spring Boot的Java家庭财务管理系统的示例: 该系统具有以下功能: - 用户登录和注册 - 记录收入和支出 - 显示收入和支出的统计信息 - 编辑和删除收入和支出记录 该系统的技术栈包括Java、Spring Boot、SSM、MySQL、Maven、Thymeleaf和HTML。其中,Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。SSM是Spring、Spring MVC和MyBatis的缩写,是一种常用的Java Web开发框架。MySQL是一种流行的关系型数据库管理系统。Maven是一个Java项目管理工具,可以帮助开发人员管理项目依赖关系。Thymeleaf是一种Java模板引擎,可以帮助开发人员构建动态Web页面。 以下是该系统的一些示例代码: 1. 记录收入和支出 ```java @Entity @Table(name = "record") public class Record { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String type; private Double amount; private String category; private String note; private Date date; // getters and setters } @Controller public class RecordController { @Autowired private RecordRepository recordRepository; @GetMapping("/record") public String recordForm(Model model) { model.addAttribute("record", new Record()); return "record"; } @PostMapping("/record") public String recordSubmit(@ModelAttribute Record record) { recordRepository.save(record); return "redirect:/record"; } } <form action="#" th:action="@{/record}" th:object="${record}" method="post"> <input type="text" th:field="*{type}" placeholder="Type"/> <input type="text" th:field="*{amount}" placeholder="Amount"/> <input type="text" th:field="*{category}" placeholder="Category"/> <input type="text" th:field="*{note}" placeholder="Note"/> <input type="date" th:field="*{date}" placeholder="Date"/> <button type="submit">Submit</button> </form> ``` 2. 显示收入和支出的统计信息 ```java @Repository public interface RecordRepository extends JpaRepository<Record, Long> { @Query("SELECT SUM(r.amount) FROM Record r WHERE r.type = 'income'") Double findTotalIncome(); @Query("SELECT SUM(r.amount) FROM Record r WHERE r.type = 'expense'") Double findTotalExpense(); } @Controller public class StatisticController { @Autowired private RecordRepository recordRepository; @GetMapping("/statistic") public String statistic(Model model) { Double totalIncome = recordRepository.findTotalIncome(); Double totalExpense = recordRepository.findTotalExpense(); model.addAttribute("totalIncome", totalIncome); model.addAttribute("totalExpense", totalExpense); return "statistic"; } } <div> <p>Total Income: <span th:text="${totalIncome}"></span></p> <p>Total Expense: <span th:text="${totalExpense}"></span></p> </div> ``` 3. 编辑和删除收入和支出记录 ```java @Controller public class RecordController { @Autowired private RecordRepository recordRepository; @GetMapping("/record/{id}/edit") public String recordEditForm(@PathVariable Long id, Model model) { Record record = recordRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid record id:" + id)); model.addAttribute("record", record); return "record-edit"; } @PostMapping("/record/{id}/edit") public String recordEditSubmit(@PathVariable Long id, @ModelAttribute Record record) { record.setId(id); recordRepository.save(record); return "redirect:/record"; } @GetMapping("/record/{id}/delete") public String recordDelete(@PathVariable Long id) { recordRepository.deleteById(id); return "redirect:/record"; } } <a th:href="@{/record/{id}/edit(id=${record.id})}">Edit</a> <a th:href="@{/record/{id}/delete(id=${record.id})}">Delete</a> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值