JavaSE 案例练习——精算师 double精度丢失解决思路

news/2024/4/30 8:39:50/文章来源:https://blog.csdn.net/m0_57042151/article/details/127276201

案例介绍

具体的内容是这样的

编写一个程序,提示输入一个代表总钱数的双精度值,然后确定每种纸币和硬币需要的最少数量以达到输入的总钱数。

假设人民币种类如下:佰圆纸钞,伍拾圆纸钞,贰拾圆纸钞,拾圆纸钞,伍圆纸钞,壹圆硬币,伍角硬币,壹角硬币,壹分硬币。(提示:使用求模运算符,自上而下求得每种钱币的数量)。

例如,输入值为127.63元人民币,那么程序应当输出如下结果:

  • 1张佰圆纸钞;

  • 0张伍拾圆纸钞;

  • 1张贰拾圆纸钞;

  • 0张拾圆纸钞;

  • 1张伍圆纸钞;

  • 2个壹圆硬币;

  • 1个伍角硬币;

  • 1个壹角硬币;

  • 3个壹分硬币。

解题

思考

这题还是有思路的:

题干中说到:确定每种纸币和硬币需要的最少数量以达到输入的总钱数。

可以理解为:

  • 尽量用最大数值的钱币去找零钱
  • 那么我们应该从最大的钱币 开始 去扣掉这个数值
  • 程序的顺序 从最大的钱币 到最小的钱币,直到找完

操作

因此,可以编写如下的代码:


import java.util.Scanner;public class countMoney {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("输入一个代表总钱数的双精度值,例如127.63");double money = sc.nextDouble();
//       double money = 127.63;//佰圆纸钞;  100int bai = (int)(money / 10 /10 % 10);System.out.println(bai+" 张佰圆纸钞");// 去掉一百钞用掉的money = money - (100 * bai);System.out.println("----------剩余可换的钱:"+money);//伍拾圆纸钞;50int wushi =(int)( (money / 50));System.out.println(wushi+" 张伍拾圆纸钞");// 去掉五十钞用掉的money = money - (50 * wushi);System.out.println("----------剩余可换的钱:"+money);//贰拾圆纸钞;20int ershi =(int)( (money / 20) );System.out.println(ershi+" 张贰拾圆纸钞");// 去掉二十钞用掉的money = money - (20 * ershi);System.out.println("----------剩余可换的钱:"+money);//拾圆纸钞;10int shi =(int)( (money / 10) );System.out.println(shi+" 张贰拾圆纸钞");// 去掉十钞用掉的money = money - (10 * shi);System.out.println("----------剩余可换的钱:"+money);//伍圆纸钞;5int wu =(int)( (money / 5) );System.out.println(wu+" 张伍圆纸钞");// 去掉5钞用掉的money = money - (5 * wu);System.out.println("----------剩余可换的钱:"+money);//壹圆硬币;1int yi =(int)( (money / 1) );System.out.println(yi+" 张壹圆硬币");// 去掉1钞用掉的money = money - (1 * yi);System.out.println("----------剩余可换的钱:"+money);//伍角硬币;0.5int lindianwu =(int)( (money / 0.5) );System.out.println(lindianwu+" 张伍角硬币");// 去掉0.5钞用掉的money = money - (0.5 * lindianwu);System.out.println("----------剩余可换的钱:"+money);//壹角硬币;0.1int yijiao =(int)( (money / 0.1) );System.out.println(yijiao+" 壹角硬币");// 去掉0.1钞用掉的money = money - (0.1 * yijiao);System.out.println("----------剩余可换的钱:"+money);//壹分硬币。0.01// 四舍五入技法//  String result = String.format("%.2f", a);String result = String.format("%.2f", money);//System.out.println(result);int yifen = (int)(Double.parseDouble(result) / 0.01);System.out.println(yifen+" 张壹角硬币");}
}//编写一个程序,提示输入一个代表总钱数的双精度值,然后确定每种纸币和硬币需要的最少数量以达到输入的总钱数。
//假设人民币种类如下:佰圆纸钞,伍拾圆纸钞,贰拾圆纸钞,拾圆纸钞,伍圆纸钞,壹圆硬币,伍角硬币,壹角硬币,壹分硬币。(提示:使用求模运算符,自上而下求得每种钱币的数量)。
//例如,输入值为127.63元人民币,那么程序应当输出如下结果:
//1张佰圆纸钞;
//0张伍拾圆纸钞;
//1张贰拾圆纸钞;
//0张拾圆纸钞;
//1张伍圆纸钞;
//2个壹圆硬币;
//1个伍角硬币;
//1个壹角硬币;
//3个壹分硬币。

反思

在输出打印剩余可换的钱的时候,可以看到,出现了特别长的小数

这是怎么回事呢

答案很明显,这是因为double类型,存在精度丢失的问题

那,有没有办法可以解决这个问题呢

精度丢失在Java中常见的两种解决方案

小数转整数

you know 蟹不肉

整数不存在精度问题,所以常用的方式是将涉及的浮点数转成整数。

而我们熟知的,int可容纳 -2147483648 到 2147483647的数值

因此,这种方法,常常用在小型会计系统,而且,小型会计系统小数位是固定位数才有意义

比如 23.64元,小数位固定在两位

这个时候就可以把浮点数*100 转成整数,变成2364来计算

使用BigDecimal

大数字的精确计算就经常用到这个类: BigDecimal

唯一要注意的细节是:BigDecimal初始化时,你往构造器传入double类型数据还是会存在精度丢失

那咋办呢

那就把double用包装类Double转成String类型,把他变成String类型再传入BigDecimal构造器

兜兜转转真奇妙

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_22379.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Asible最佳实践-进阶版-RHCA447 定义分组与变量

Asible最佳实践-进阶版-RHCA447 -------定义角组变量/主机变量/变量文件6.1 所有受管节点设置sudo免密[root@libin libin]# vim /etc/sudoers.d/devops libin ALL=(ALL) NOPASSWD:ALL [root@libin sudoers.d]# scp devops 192.168.124.134:`pwd` 6.2 自定义ansible目录[root@l…

学习使用jquery控制select下拉选项的字体样式

学习使用jquery控制select下拉选项的字体样式实现代码实现代码 <script src"../jquery-2.1.4.min.js"></script><style>div#container {padding: 30px;font-family: verdana, lucida;}a {color: #777;display: block;background-color: #ccc;widt…

向开发者开放免费注册!“远眺捷码”提供一站式软件快速开发平台

近日&#xff0c;远眺科技旗下具有自主知识产权的国产一站式软件快速开发平台——“远眺捷码”宣布正式开放免费注册&#xff0c;有各类软件应用开发等需求开发者、软件开发企业&#xff0c;可访问捷码官网https://www.gemcoder.com/ 操作步骤&#xff1a; Step1、打开捷码PC端…

客户成功 | 数据解码技能提升,Smartbi助力长沙烟草找到“新路子”

让数据会“说话”能“干活”&#xff0c;为客户挖掘出更深层的数据价值&#xff0c;是Smartbi一直以来助力企业数字化转型的目标和方向。大数据时代&#xff0c;每个科学的决策离不开数据的支撑&#xff0c;数字化精益管理是各行业提升自身运营管理的必然选择。数字化转型的成色…

实验1c语言开发环境使用和数据类型,运算符和表达式

1.试验任务1 (1)在垂直方向上打印两个字符小人的源代码,以及运行结果截图\\在垂直方向上打印两个字符小人#include<stdio.h> int main() {printf(" o\n");printf("<H>\n");printf("I I\n");printf("\n\n");printf(&quo…

【PMP学习笔记】第10章 项目沟通管理

【PMP学习笔记】第10章 项目沟通管理 什么是项目沟通管理? 让正确的信息在正确的时间通过正确的方式传递给正确的人,达到正确的效果。一、规划沟通管理规划沟通管理是基于每个相关方或相关方群体的信息需求、可用的组织资产,以及具体项目的需求,为项目沟通活动制定恰当的方…

基于SSM的网上餐厅管理系统

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1研究背景及意义 1 1.2研究现状 1 1.3章节安排 2 第二章 相关技术说明 3 2.1 JSP(Java Server Page)简介 3 2.2 Spring框架简介 3 2.3 Spring MVC框架简介 5 2.4 MyBatis 框架简介 5 2.4 MySql数据库简介 6 2.5 Eclipse简介 6 2.6 T…

顺序表的实现

函数接口定义:顺序表描述的结构体为 typedef struct {ElemType *elem; //存储空间的基地址int length; //当前长度 } SqList;需要实现函数的接口分别为:int GetElem(SqList L, int i, ElemType &e) 顺序表的取值 判断i值是否合理,若不合理,返回0;[i-1]单元存储第i个数…

服务器开发26:Linux中线程和进程的联系与区别(游戏后端请和游戏思考10一起食用)

文章目录一、线程创建方法&#xff08;以redis举例&#xff09;1&#xff09;创建线程函数讲解2&#xff09;线程创建的标记二、内核中对线程的数据结构表示1&#xff09;task_struct具体定义2&#xff09;线程与进程的区别三、进程、线程创建过程及异同1&#xff09;进程创建(…

Oracle Form Builder 安装时遇到的问题记录

Oracle Form Builder 安装时遇到的问题记录 问题1&#xff1a;Checking operating system version: must be 5.0, 5.1 or 5.2. Actual 6.1 Checking operating system version: must be 5.0, 5.1 or 5.2. Actual 6.1 Failed <<<< 解决方法&#xff1a; 修改x:\ds…

JAVAEE多线程synchronized 优化过程

文章目录synchronized 优化过程一、锁升级/锁膨胀1. 偏向锁2. 轻量级锁3. 重量级锁二、锁消除三、锁粗化总结synchronized 优化过程 对于synchronized 1.既是乐观锁,也是悲观锁 2.既是轻量级锁,也是重量级锁 3.乐观锁的部分是基于自旋锁实现的,悲观锁的部分是基于挂起等待锁实…

springboot+jsp云课堂在线教育系统javaweb

“云课堂”在线教育系统是由高校学生依据兴趣爱好自愿组成&#xff0c;按照章程自主开展在线教育课程。“云课堂”在线教育系统是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高学生综合素质、引导学生适应社会、促进学生成才就业等方面发挥着重要作用…

【23种设计模式】组合模式(Composite Pattern) .Net Core实现

文章目录需求变更我们应该怎么做?组合和单个对象是指什么呢?使用组合模式来设计菜单组合迭代器来源组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&…

【服务器数据恢复】AIX环境下误删除逻辑卷的数据恢复方案

一、AIX存储层面相关的知识&AIX环境下LV误删除后的恢复方案。 对于AIX而言&#xff0c;PV相当于物理磁盘&#xff0c;一个VG由若干个PV组成&#xff0c;这让我们可以将容量不同的存储空间组合起来进行统一分配。AIX把同一个VG的所有PV按相同大小的存储颗粒&#xff08;PP&…

自制操作系统系列(二):软盘读取

代码仓库地址&#xff1a;https://github.com/freedom-xiao007/operating-system 简介 在上一篇中&#xff0c;我们使用汇编编写了一个直接显示hello的程序&#xff0c;接下来我们继续探索如果使用汇编读取软盘数据 软盘数据读取准备 在上一篇中&#xff0c;我们使用nasm将…

让运维化繁为简,云原生可观测平台 Alibaba Cloud Lens 正式发布

9 月 28 日&#xff0c;阿里云正式推出云产品可观测平台 Alibaba Cloud Lens&#xff08;Lens 透镜&#xff0c;意为洞察细微变化&#xff09;&#xff0c;从成本、性能、安全、数据保护、稳定性、访问分析六个维度&#xff0c;为用户提供对存储类、网络类、数据库类等云产品的…

还在埋头敲代码?不妨学学设计模式,必能让你工作事半功倍

设计模式在开发中占很重要的地位&#xff1b;在大型项目中使用好设计模式往往会取得事半功倍的效果&#xff1b;下面就介绍下几种在开发中常用到的设计模式 装饰者模式(Decorator Pattern) 装饰者模式是在不必改变原类文件和使用继承的情况下&#xff0c;动态地扩展一个对象的…

中断系统:外部中断

中断系统&#xff1a;外部中断 实现功能 按下独立按键Key3&#xff0c;LED流水灯向右&#xff1b;按下Key4&#xff0c;LED流水灯向左。 单片机型号&#xff1a;STC89C52 硬件原理 中断系统就是当系统在进行一项工作时&#xff0c;需要终止这项工作&#xff0c;转而去执行另一…

Springboot复习

本笔记来自b站尚硅谷 文章目录SpringbootHelloWorld原理Value获取值和ConfigurationProperties获取值比较PropertySource 和 ImportResourceprofile自动配置原理整合日志指定配置全面接管SpringMVC启动流程自定义starterdev-toolsyml提示指标监控Springboot HelloWorld原理 配置…

Python函数练习题:通讯录管理程序实战案例

嗨害大家好鸭&#xff01;我是小熊猫❤ 好久没有整实战案例类文章辽 今天就来整一整~ 功能简介 实现一个通讯录管理程序&#xff0c;使用函数来实现程序&#xff0c;采用模块化的程序设计方法&#xff1a; 划分通讯录程序的功能模块&#xff0c;使用函数实现相应的功能首先…