자바 위 챗 보너스
요구 하 다.
BigDecimal 류 를 바탕 으로 위 챗 보너스 알고리즘 의 기능 을 실현 합 니 다.예 를 들 어 보너스 총 금액 을 설정 한 다음 에 생 성 해 야 할 보너스 개 수 를 설정 하고 모든 보너스 에 무 작위 로 금액 을 지정 합 니 다.최저 0.01 위안 보다 낮 으 면 안 됩 니 다.요구:
1.각 보너스 금액 은 랜 덤 으로 지정
2.각 보너스 금액 은 0.01 위안 보다 낮 으 면 안 됩 니 다.
3.모든 보너스 금액 의 합 이 총 금액 과 같 아야 한다.
4.만약 에 평균 적 으로 각 보너스 금액 이 0.01 위안 이 안 될 때 하나의 RedPacketException 을 던 지면 각 보너스 금액 이 0.01 위안 보다 적 으 면 안 된다 는 것 을 알려 준다.
실현 방법
이 문 제 는 자바 상용 류 중 Random,BigDecimal 및 ArrayList 류 의 종합 적 인 사용 능력 을 고찰 하 는 동시에 대상(포장,계승,다 형)기술 에 대해 실천 능력 을 고찰 한다.
코드
보너스
보너스 의 기본 유형 을 만 듭 니 다.속성 포함:보너스 id,보너스 금액;구조 기:매개 변수 가 있 고 매개 변수 가 없습니다.방법:set 방법,get 방법;toString 다시 쓰기;
/**
*
* @author mrchai
*
*/
public class RedPacket {
/** ID*/
private int id;
/** */
private BigDecimal money;
public RedPacket() {
}
public RedPacket(int id, BigDecimal money) {
super();
this.id = id;
this.money = money;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public BigDecimal getMoney() {
return money;
}
public void setMoney(BigDecimal money) {
this.money = money;
}
@Override
public String toString() {
return id+" "+money+" ";
}
}
보너스 이상 클래스이상 클래스 를 만 듭 니 다.이 이상 계승 Exception 은 매개 변수 와 매개 변수 가 없 는 구조 기 를 설정 합 니 다.구조 기 를 통 해 부모 클래스 의 방법 을 직접 호출 합 니 다.
/**
*
* @author mrchai
*/
public class RedpacketException extends Exception{
public RedpacketException() {
// TODO Auto-generated constructor stub
}
public RedpacketException(String msg) {
super(msg);
}
}
보너스 관리실습 문제 기능 의 주요 유형 은 genRedPacke()방법 으로 보너스 총 금액 을 분배 하고 randomScale()방법 은 모든 보너스 금액 의 비례 를 포함 하 는 배열 을 되 돌려 줍 니 다.genRedPacke()방법 에 서 는 randomScale()방법 으로 기능 을 수행 할 수 있 습 니 다.
package com.softeem.lesson18.RedPacket;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Random;
public class RedPacketManage {
/** */
static final BigDecimal MIN = new BigDecimal("0.01");
/**
* @double total
* @int count
* @return
*/
public static ArrayList<RedPacket> genRedPacket(double total, int count) throws RedPacketException {
//
ArrayList<RedPacket> packets = new ArrayList<RedPacket>();
//
double min = MIN.multiply(new BigDecimal(count)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
if (min > total) {
// ,
throw new RedPacketException(" 0.01 ");
} else if (min == total) {
// 0.01 ,
for (int i = 0; i < count; i++) {
//
RedPacket item = new RedPacket(i + 1, new BigDecimal("0.01"));
//
packets.add(item);
}
} else {
// ,
// BigDecimal
BigDecimal totalMoney = new BigDecimal(total);
// 0.01
// 0
for(int i=0;i<count;i++) {
packets.add(new RedPacket(i+1, new BigDecimal("0.01")));
}
//
totalMoney = totalMoney.subtract(new BigDecimal(min));
//
BigDecimal now = new BigDecimal(0);
//
double[] scale = randomScale(count);
// count-1
for (int i = 0; i < count - 1; i++) {
//
BigDecimal item = totalMoney.multiply(new BigDecimal(scale[i]))
.setScale(2, BigDecimal.ROUND_HALF_EVEN);
//
packets.get(i).setMoney(packets.get(i).getMoney().add(item));
//
now = now.add(item);
}
//
//
BigDecimal last = totalMoney.subtract(now);
//
packets.get(count-1).setMoney(packets.get(count-1).getMoney().add(last).setScale(2, BigDecimal.ROUND_HALF_EVEN));
}
return packets;
}
/**
*
* @param count
* @return
*/
private static double[] randomScale(int count) {
//
double[] scale = new double[count];
Random r = new Random();
double total = 0.0;
for (int i = 0; i < count; i++) {
// 1-100
scale[i] = r.nextInt(100) + 1;
//
total += scale[i];
}
//
for (int i = 0; i < count; i++) {
scale[i] = scale[i] / total;
}
return scale;
}
public static void main(String[] args) throws RedPacketException {
ArrayList<RedPacket> list = genRedPacket(0.1, 5);
BigDecimal t = new BigDecimal(0);
for (RedPacket rp : list) {
System.out.println(rp);
t= t.add(rp.getMoney());
}
System.out.println(t);
}
}
테스트RedPacket 이라는 요 소 를 가 진 Array List 배열 을 만 들 고 출력 배열 의 대상 을 옮 겨 다 닙 니 다.보너스 클래스 에 toString 방법 을 다시 썼 기 때문에 보너스 대상 을 직접 출력 하여 보너스 획득 자 와 금액 을 표시 할 수 있 습 니 다.BigDecimal 대상 을 만 들 고 각 보너스 금액 을 누적 하여 총 금액 을 받 습 니 다.
public static void main(String[] args) throws RedpacketException {
ArrayList<RedPacket> list = genRedPacket(0.1, 5);
BigDecimal t = new BigDecimal(0);
for (RedPacket rp : list) {
System.out.println(rp);
t= t.add(rp.getMoney());
}
System.out.println(t);
}
실행 결과총결산
1.double 형식의 값 은 직접 계산 할 수 있 는데 왜 BigDecimal 형식 으로 바 꾸 어 계산 합 니까?
답:double 유형 은 가감 승제 연산 을 할 수 있 지만 일정한 오차 가 발생 할 수 있 으 며 정밀도 요구 가 높 지 않 은 곳 에서 직접 계산 할 수 있 습 니 다.그러나 보너스 와 같은 금액 과 관련 된 정밀도 에 대한 요구 가 높 은 문 제 는 수 요 를 만족 시 킬 수 없 음 이 분명 하 다.이 럴 때 는 빅 디 밀 타 입 으로 전환 해 정밀도 문 제 를 효과적으로 해결 할 수 있다.
2.자신 이 정의 한 총 금액 이 너무 낮 으 면 보너스 금액 이 0 인 문제 가 발생 하지 않 습 니까?
답:여기 코드 의 해결 방향 은:
보너스 금액 이 분배 되 지 않 을 때 이상 을 던 집 니 다.즉,총 금액 이 MIN 곱 하기 count 보다 적 을 때 이상 을 던 집 니 다.
보너스 금액 은 1 인당 0.01 위안 만 분배 할 수 있 으 면 평균 분배 한다.
총 금액 이 1 인당 최소 금액 의 합 보다 클 때 무 작위 로 분배 한다.
이때 총 금액 이 너무 적어 보너스 금액 이 0 이 되 지 않도록 1 인당 최저 금액 인 0.01 원 을 먼저 배정 한 뒤 총 금액 을 기 존 에 1 인당 최저 할당 금액 을 뺀 것 으로 설정 했다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.