자바 위 챗 보너스

6816 단어 자바상여금
본 논문 의 사례 는 자바 가 위 챗 보 너 스 를 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
요구 하 다.
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 인당 최저 할당 금액 을 뺀 것 으로 설정 했다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기