看了网上很多说法,没有具体把它实现的,我试了一下其实还是比较简单的。

直接看代码:

package com.infomorrow;

import java.math.BigInteger;
import org.junit.Test; /**
* @ClassName: test_biginteger
* @Description: 设计一个百亿计算器的回头乘除
* @author: amosli
* @email:amosli@infomorrow.com
* @date 2014年2月26日 下午12:48:51
*/
public class test_biginteger {
@Test
public void test(){
double x = Math.pow(2, 64);
BigInteger xBigInteger = BigInteger.valueOf((long) x);
double y = Math.pow(2, 64);
System.out.println("y = "+y);
BigInteger yBigInteger = BigInteger.valueOf((long) y);
System.out.println("x*y = "+multiply(xBigInteger, yBigInteger));
System.out.println("x+y = "+add(xBigInteger, yBigInteger));
System.out.println("x-y = "+subtract(xBigInteger, yBigInteger));
System.out.println("x/y = "+divide(xBigInteger, yBigInteger));
}
/*
* 加法:x+y
*/
public BigInteger add(BigInteger x,BigInteger y){
return x.add(y);
}
/*
* 减法: x-y
*/
public BigInteger subtract(BigInteger x,BigInteger y){
return x.subtract(y);
}
/*
* 乘法: x*y
*/
public BigInteger multiply(BigInteger x,BigInteger y){
return x.multiply(y);
}
/*
* 除法:x/y
*/
public BigInteger divide(BigInteger x,BigInteger y){
return x.divide(y);
}
}

输出结果:

y = 1.8446744073709552E19
x*y = 85070591730234615847396907784232501249
x+y = 18446744073709551614
x-y = 0
x/y = 1

看了上面的代码,是不是感觉很简单?

这里用到了 BigInteger这个类中的方法进行加减乘除的。

常见的数据类型:

数据类型 类型名 位长 取值范围 默认值

布尔型 boolean 1 true,false false

字节型 byte 8 -128-127 0

字符型 char 16 ‘\u000’-\uffff ‘\u0000’

短整型 short 16 -32768-32767 0

整型 int 32 -2147483648,2147483647 0

长整型 long 64 -9.22E18,9.22E18 0

浮点型 float 32 1.4E-45-3.4028E+38 0.0

双精度型 double 64 4.9E-324,1.7977E+308 0.0

这里特别要提出出的两种类型:

BigInteger 任意大的整数,原则上是,只要你的计算机的内存足够大,可以有无限位的.

BigDecimal  BigDecimal的实现利用到了BigInteger, 所不同的是BigDecimal加入了小数位的概念,所以对于想要精度的同学来说用这个比较好。

BigDecimal.ROUND_UP 最后一位如果大于0,则向前进一位,正负数都如此。
  BigDecimal.ROUND_DOWN 最后一位不管是什么都会被舍弃。
  BigDecimal.ROUND_CEILING 如果是正数,按ROUND_UP处理,如果是负数,按照ROUND_DOWN处理。例如7.1->8; -7.1->-7;所以这种近似的结果都会>=实际值。
  BigDecimal.ROUND_FLOOR 跟BigDecimal_ROUND_CEILING相反。例如7.1->7;-7.1->-8。这种处理的结果<=实际值。
  BigDecimal.ROUND_HALF_DOWN 如果最后一位<=5则舍弃,如果>5, 向前进一位。如7.5->7;7.6->8;-7.5->-7
  BigDecimal.ROUND_HALF_UP 如果最后一位<5则舍弃,如果>=5, 向前进一位。反之舍弃。如7.5->8;7.4->7;-7.5->-8
  BigDecimal.ROUND_HALF_EVEN 如果倒数第二位是奇数,按照BigDecimal.ROUND_HALF_UP处理,如果是偶数,按照         BigDecimal.ROUND_HALF_DOWN来处理。如7.5->8;8.5->8;7.4->7;-7.5->-8

用BigDecimal实现乘法,保留了精度,上面x,y定义不变,可以改写为:

BigDecimal aBigDecimal = BigDecimal.valueOf(x).multiply(BigDecimal.valueOf(y));
System.out.println("aBigDecimal:"+aBigDecimal);

输出:

aBigDecimal:3.40282366920938477630474056040704E+38

参考文章:1.BigInteger 与 BigDecimal区别

               2.BigInteger介绍

java面试题--实现一个百亿的计算器的更多相关文章

  1. java面试题0004-在一个类上是否可以用abstract和final同时加以修饰?

    我们先用提干两个修饰词中的任意一个创建一个类 package components.javaTest.day4_20200910; /** * Question004: * java面试题0004-在 ...

  2. [原]Java面试题-输入一个整型数组,找出最大值、最小值,并交换。

    [Date]2013-09-19 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Content]: 1.面试题 输入一个整型 ...

  3. java 考试试题

    Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他.有些题来自网上搜集整理,有些题来自学员 ...

  4. JAVA笔试题(全解)

      目录 一. Java基础部分................................................................. 9 1.一个".java& ...

  5. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  6. Java面试题大全(javaSe,HTML,CSS,js,Spring框架等)

    目录 1. Java基础部分 7 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2.Java有没有goto? 7 3.说说&和& ...

  7. java 面试题 1-10

    1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 1.一个".java&q ...

  8. 杭电HDOJ--ACM1002(JAVA解题,运用BigInteger)(自定义MBigInteger 简单实现大数处理----完善后可以实现百亿计算器)

    转载声明:原文转自http://www.cnblogs.com/xiezie/p/5501901.html     JAVA解题:   import java.util.*; import java. ...

  9. Java笔试题:给定一个ReadOnlyClass的对象roc,能否把这个对象的age值改成30?

    在Java笔试面试中,经常会遇到代码题,今天我们就来看一则Java代码笔试题. 有如下代码: Class ReadOnlyClass { private Integer age=20; public ...

随机推荐

  1. light oj 1007 Mathematically Hard (欧拉函数)

    题目地址:light oj 1007 第一发欧拉函数. 欧拉函数重要性质: 设a为N的质因数.若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N ...

  2. DICOM-RT:放疗领域中的各种影像

    背景: DICOM-RT系列博文着眼于DICOM3.0中对放疗领域的补充标准,即DICOM-RT.为了方便兴许对DICOM-RT中相关IOD.SOP概念的理解,专栏最近做了放疗相关知识点的普及. PS ...

  3. 【大数据】大数据处理-Lambda架构-Kappa架构

    大数据处理-Lambda架构-Kappa架构 elasticsearch-head Elasticsearch-sql client NLPchina/elasticsearch-sql: Use S ...

  4. centos:添加用户

    初步进入centos学习,配置用户 1,创建用户 创建用户 hadoop [root@master spark]# useradd hadoop [root@master spark]# 2,创建密码 ...

  5. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(四)针对hadoop2.9.0启动执行start-all.sh出现异常:failed to launch: nice -n 0 /bin/spark-class org.apache.spark.deploy.worker.Worker

    启动问题: 执行start-all.sh出现以下异常信息: failed to launch: nice -n 0 /bin/spark-class org.apache.spark.deploy.w ...

  6. O2O、C2C、B2B、B2C

    一.O2O.C2C.B2B.B2C的区别在哪里? O2O是Online to offline 分为四种运营模式 1.Online to offline 是线上交易到线下消费体验 2.Offline t ...

  7. [Git] Move some commits to a separate branch that I have accidentally committed to master

    Gosh no, I just added all of these commits to master. They were thought to be peer reviewed first in ...

  8. JavaScript 将行结构数据转化为树形结构,可提供给常用的tree插件直接使用(高效转化方案)

    前台接收到的数据格式 var rows=[{ parent: 'root', id: 'DC', title: '集团' }, { parent: 'DC', id: '01', title: '上海 ...

  9. ASP.NET匿名对象与集合的使用

    一.关于匿名类型的特性 1.匿名类型 定义:匿名对象 var vobj = new { id = "编号", title = "标题", content = & ...

  10. WebStorm 之 Cordova 环境搭建

    一.环境搭建 Cordova 环境配置之前,应先下载安装 Node.js ,中文官网:http://nodejs.cn/. 以管理员身份运行 cmd 命令行工具: 1.查看 Node.js 是否已安装 ...