java 數(shù)學(xué)計算

java 數(shù)學(xué)計算

java.lang.Math 庫提供了常用的數(shù)學(xué)計算工具

常量

final double E = 2.7182818284590452354;                 // 自然對數(shù)底數(shù)
final double PI = 3.14159265358979323846;               // 圓周率
final double DEGREES_TO_RADIANS = 0.017453292519943295; // 角度轉(zhuǎn)弧度
final double RADIANS_TO_DEGREES = 57.29577951308232;    // 弧度轉(zhuǎn)角度

取整

  • abs(x): 絕對值
  • floor(x): 向下取整
  • ceil(x): 向上取整
  • round(x): 四舍五入,如果有兩個(x.5)怒见,返回較大的那個數(shù)
  • rint(x): 最接近的整數(shù),如果有兩個(x.5)谴咸,返回偶數(shù)
  • floorDiv(x, y): 向下取整除法
  • floorMod(x, y): java 默認的取摸 % 得到的結(jié)果和 x 的符號相同收壕,floorMody 的符號相同
double delta = 0.0000001;
assertEquals(Math.abs(-6), 6);
assertEquals(Math.floor(-6.2), -7, delta);  // 向下取整
assertEquals(Math.floor(6.2), 6, delta);
assertEquals(Math.floor(6.8), 6, delta);
assertEquals(Math.ceil(-6.2), -6, delta);   // 向上取整
assertEquals(Math.ceil(6.2), 7, delta);
assertEquals(Math.ceil(6.8), 7, delta);
assertEquals(Math.round(-6.2), -6, delta);  // 四舍五入
assertEquals(Math.round(6.2), 6, delta);
assertEquals(Math.round(6.8), 7, delta);
assertEquals(Math.round(-6.5), -6, delta);
assertEquals(Math.round(6.5), 7, delta);
assertEquals(Math.rint(-6.2), -6, delta);  // 最接近整數(shù)描馅,如果存在兩個竖伯,返回偶數(shù)
assertEquals(Math.rint(6.2), 6, delta);
assertEquals(Math.rint(6.8), 7, delta);
assertEquals(Math.rint(-6.5), -6, delta);
assertEquals(Math.rint(6.5), 6, delta);

assertEquals(Math.floorDiv(7, 3), 2);
assertEquals(Math.floorDiv(-7, 3), -3);
assertEquals(Math.floorMod(7, 3), 1);
assertEquals(Math.floorMod(-7, -3), -1);
assertEquals(Math.floorMod(-7, 3), 2);
assertEquals(-7 % -3, -1);
assertEquals(-7 % 3, -1);

三角函數(shù)

assertEquals(Math.sin(Math.PI / 2), 1.0, delta);
assertEquals(Math.cos(Math.PI), -1, delta);
assertEquals(Math.tan(Math.PI / 4), 1.0, delta);
assertEquals(Math.asin(1), Math.PI / 2, delta);
assertEquals(Math.acos(-1), Math.PI, delta);
assertEquals(Math.atan(1), Math.PI / 4, delta);

指數(shù)對數(shù)

  • pow(x, y): x^y蜡镶,xy 次方
  • sqrt(x): √x茫舶,x 的平方根
  • cbrt(x): 三次方根
  • hypot(x, y): √(x2 + y2)
  • exp(x): e ^ x
  • expm1(x): e ^ x - 1
  • log(x): ln(x)
  • log10: lg(x)
  • log1p(x): ln(1+x)
assertEquals(Math.pow(3, 2), 9, delta);
assertEquals(Math.pow(2, 3), 8, delta);
assertEquals(Math.sqrt(4), 2, delta);
assertEquals(Math.cbrt(27), 3, delta);
assertEquals(Math.hypot(3, 4), 5, delta);   // √(x2 + y2)

assertEquals(Math.exp(2.5), Math.pow(Math.E, 2.5), delta);  // e ^ x
assertEquals(Math.expm1(2), Math.exp(2) - 1, delta);    // e ^ x - 1
assertEquals(Math.log(Math.exp(1.5)), 1.5, delta);  // ln(x)
assertEquals(Math.log10(1000), 3, delta);           // lg(x)
assertEquals(Math.log1p(Math.E - 1), 1, delta);     // ln(1 + x)

雙曲函數(shù)

  • sinh(x): (e ^ x - e ^ -x) / 2
  • cosh(x): (e ^ x + e ^ -x) / 2
  • tanh(x): sinh(x) / cosh(x)
assertEquals(Math.sinh(2), (Math.exp(2) - Math.exp(-2)) / 2, delta);    // sinh(x) = (e ^ x - e ^ -x) / 2
assertEquals(Math.cosh(2), (Math.exp(2) + Math.exp(-2)) / 2, delta);    // cosh(x) = (e ^ x + e ^ -x) / 2
assertEquals(Math.tanh(2), Math.sinh(2) / Math.cosh(2), delta);         // tanh(x) = sinh(x) / cosh(x)

精確計算

普通的數(shù)值計算在溢出時是沒有感知的械巡,比如 Long.MAX_VALUE + 1 將得到結(jié)果 Long.MIN_VALUE,為了解決這種不合理饶氏,Math 提供了一些輔助函數(shù)讥耗,在結(jié)果溢出時將拋出異常

  • addExact(x, y): 加法
  • multiplyExact(x, y): 乘法
  • decrementExact(x, y): 遞減
  • incrementExact(x, y): 遞增
  • negateExact(x, y): 相反數(shù)
  • multiplyFull(x, y): 接受兩個 int 返回一個 long,防止溢出
  • multiplyHigh(x, y): 返回兩個 long 乘積的高 64
assertEquals(Long.MAX_VALUE + 1, Long.MIN_VALUE);                                       // 溢出
assertThrows(ArithmeticException.class, () -> Math.addExact(Long.MAX_VALUE, 1));        // 加法溢出拋異常
assertThrows(ArithmeticException.class, () -> Math.multiplyExact(Long.MAX_VALUE, 2));   // 乘法
assertThrows(ArithmeticException.class, () -> Math.decrementExact(Long.MIN_VALUE));     // 遞減
assertThrows(ArithmeticException.class, () -> Math.incrementExact(Long.MAX_VALUE));     // 遞增
assertThrows(ArithmeticException.class, () -> Math.negateExact(Long.MIN_VALUE));        // 相反數(shù)
assertEquals(Math.addExact(1, 2), 3);
assertEquals(Math.multiplyExact(2, 3), 6);
assertEquals(Math.incrementExact(6), 7);
assertEquals(Math.decrementExact(6), 5);
assertEquals(Math.negateExact(-6), 6);

assertEquals(Math.multiplyFull(1, 2), 2);   // 接受兩個 int 返回一個 long疹启,防止溢出
assertEquals(Math.multiplyHigh(1, 2), 0);   // 返回兩個 long 乘積的高 64 位

浮點數(shù)

任意兩個浮點數(shù)之間都有無數(shù)個浮點數(shù)古程,因此大部分浮點數(shù)是無法表示的,只能選取一個最接近的喊崖,java 提供了一些接口來獲取能表示的浮點數(shù)

System.out.println(Math.nextUp(1.1));   // 下一個浮點數(shù)
System.out.println(Math.nextDown(1.1)); // 上一個浮點數(shù)
System.out.println(Math.nextAfter(1.1, Double.POSITIVE_INFINITY));    // 下一個浮點數(shù)
System.out.println(Math.nextAfter(1.1, Double.NEGATIVE_INFINITY));    // 上一個浮點數(shù)

隨機數(shù)

math 庫隨機數(shù)

System.out.println(Math.random());          // 0 ~ 1 之間的隨機數(shù)

java.lang.Random

Random 類提供了更豐富的隨機方法挣磨,可以返回各種不同類型的隨機數(shù)

Random r = new Random();
System.out.println(r.nextInt());
System.out.println(r.nextLong());
System.out.println(r.nextFloat());
System.out.println(r.nextDouble());

Random 還提供了流式 api

Random r = new Random();
List<Integer> li = r.ints().limit(10).boxed().map((x) -> Math.abs(x % 100)).collect(Collectors.toList());
System.out.println(li);

java.util.Random 是線程安全的,但是荤懂,跨線程的同時使用 java.util.Random 實例可能會遇到爭用茁裙,從而導(dǎo)致性能下降。在多線程設(shè)計中考慮使用java.util.concurrent.ThreadLocalRandom 代替 java.util.Random节仿,ThreadLocalRandom 和 Random 擁有一致的接口

鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晤锥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粟耻,更是在濱河造成了極大的恐慌查近,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挤忙,死亡現(xiàn)場離奇詭異霜威,居然都是意外死亡,警方通過查閱死者的電腦和手機册烈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門戈泼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赏僧,你說我怎么就攤上這事大猛。” “怎么了淀零?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵挽绩,是天一觀的道長。 經(jīng)常有香客問我驾中,道長唉堪,這世上最難降的妖魔是什么模聋? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮唠亚,結(jié)果婚禮上链方,老公的妹妹穿的比我還像新娘。我一直安慰自己灶搜,他們只是感情好祟蚀,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著割卖,像睡著了一般前酿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上究珊,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天薪者,我揣著相機與錄音,去河邊找鬼剿涮。 笑死言津,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的取试。 我是一名探鬼主播悬槽,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞬浓!你這毒婦竟也來了初婆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤猿棉,失蹤者是張志新(化名)和其女友劉穎磅叛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萨赁,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡弊琴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杖爽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敲董。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖慰安,靈堂內(nèi)的尸體忽然破棺而出腋寨,到底是詐尸還是另有隱情,我是刑警寧澤化焕,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布萄窜,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏查刻。R本人自食惡果不足惜番宁,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赖阻。 院中可真熱鬧,春花似錦踱蠢、人聲如沸火欧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苇侵。三九已至,卻和暖如春企锌,著一層夾襖步出監(jiān)牢的瞬間榆浓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工撕攒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陡鹃,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓抖坪,卻偏偏與公主長得像萍鲸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子擦俐,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容