亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Java BigDecimal 精度避坑指南:從浮點(diǎn)數(shù)誤差到實(shí)戰(zhàn)應(yīng)用

Java BigDecimal 精度避坑指南:從浮點(diǎn)數(shù)誤差到實(shí)戰(zhàn)應(yīng)用 開頭要寫得像有經(jīng)驗(yàn)的Java開發(fā)者在分享經(jīng)驗(yàn)。我做過(guò)多個(gè)金融相關(guān)的項(xiàng)目每次接手和金額有關(guān)的模塊都要先看一眼代碼里用的是 double 還是 BigDecimal。這個(gè)習(xí)慣的由來(lái)是一次線上事故——一個(gè)賬務(wù)系統(tǒng)用 double 算利息季度結(jié)算時(shí)對(duì)不上賬差了幾分錢排查了一整天最后定位到是浮點(diǎn)數(shù)精度導(dǎo)致的問(wèn)題。也正是從那次之后我對(duì) BigDecimal 的態(tài)度從會(huì)用變成了研究透。作為 Java 基礎(chǔ)篇里幾乎必考、也幾乎必用的一塊內(nèi)容BigDecimal 是真正考驗(yàn)基本功的知識(shí)點(diǎn)它不復(fù)雜但坑很多。這篇內(nèi)容我從原理講到實(shí)戰(zhàn)把用到過(guò)的細(xì)節(jié)、踩過(guò)的坑、面試?yán)锍1粏?wèn)到的點(diǎn)一次性梳理清楚。1. 為什么非用 BigDecimal 不可從 0.10.2 說(shuō)起1.1 浮點(diǎn)數(shù)精度丟失的根源先做一個(gè)最簡(jiǎn)單、也最經(jīng)典的實(shí)驗(yàn)在你的 IDE 里跑一下這段代碼System.out.println(0.1 0.2); System.out.println(1.0 - 0.9); System.out.println(0.5 * 3);輸出結(jié)果會(huì)讓你懷疑人生0.30000000000000004 0.09999999999999998 1.5前兩行都出現(xiàn)了詭異的尾巴第三行卻正常。原因在于計(jì)算機(jī)底層用二進(jìn)制存儲(chǔ)數(shù)據(jù)而二進(jìn)制并不能精確表示所有十進(jìn)制小數(shù)。0.1 轉(zhuǎn)換成二進(jìn)制后是一個(gè)無(wú)限循環(huán)小數(shù)類似于十進(jìn)制里 1/3 無(wú)法被有限表示double 只能取其近似值。0.1 0.2時(shí)兩個(gè)近似值相加誤差就疊加暴露出來(lái)了。1.5為什么沒(méi)問(wèn)題因?yàn)?0.5 正好等于 2 的負(fù)一次方二進(jìn)制可以精確表示。這也是浮點(diǎn)數(shù)精度問(wèn)題的核心規(guī)律只有能用 2 的冪次和表示的小數(shù)才是精確的其他都是近似值。1.2 float/double 在業(yè)務(wù)場(chǎng)景中為什么失控如果你只把 float/double 用在科學(xué)計(jì)算或者游戲物理引擎里誤差通常是可接受的。但一旦進(jìn)入業(yè)務(wù)系統(tǒng)情況完全不同金額計(jì)算單價(jià)×數(shù)量得到的價(jià)格用戶會(huì)拿著計(jì)算器和你對(duì)賬任何一分錢的偏差都會(huì)觸發(fā)客訴。統(tǒng)計(jì)報(bào)表百分比、平均值、增長(zhǎng)率連續(xù)運(yùn)算后誤差會(huì)不斷累積放大最后報(bào)表數(shù)據(jù)和數(shù)據(jù)庫(kù)明細(xì)對(duì)不上。計(jì)費(fèi)系統(tǒng)按分鐘計(jì)費(fèi)、按流量計(jì)費(fèi)每筆誤差看起來(lái)微小乘以海量用戶就是巨大的資金差異。數(shù)值比較if (balance targetBalance)這種直接等值判斷在浮點(diǎn)數(shù)面前是不可靠的誤差將導(dǎo)致正確業(yè)務(wù)被誤判。在這些場(chǎng)景里需要的是一個(gè)能精確表示小數(shù)并且可控舍入的類型。Java 給出的標(biāo)準(zhǔn)答案就是 BigDecimal。它的思路很直接不采用二進(jìn)制近似表示而是用一個(gè)大整數(shù)unscaled value加上一個(gè)小數(shù)位刻度scale完整還原出十進(jìn)制數(shù)值。0.1在 BigDecimal 里被存成整數(shù)1和刻度1本質(zhì)含義是1 × 10?1這是精確的。一句話總結(jié)凡是和錢、比例、精確計(jì)算有關(guān)的場(chǎng)景放棄原生浮點(diǎn)類型統(tǒng)一上 BigDecimal。2. 構(gòu)造 BigDecimal一半的坑集中在這里2.1 三種構(gòu)造方式對(duì)比BigDecimal 提供了多種構(gòu)造方式選擇哪一種是最容易踩坑的地方。先看這段真實(shí)的坑BigDecimal a new BigDecimal(0.1); System.out.println(a); // 輸出0.1000000000000000055511151231257827021181583404541015625有沒(méi)有發(fā)現(xiàn)問(wèn)題明明寫的是0.1得到的卻不是 0.1。原因在于new BigDecimal(double)接收的是 double 的二進(jìn)制近似值然后把這個(gè)近似值如實(shí)轉(zhuǎn)換為 BigDecimal。double 表示的 0.1 本身就是那個(gè)一長(zhǎng)串尾巴的近似值于是結(jié)果就污染了。而換成字符串構(gòu)造結(jié)果立刻清爽BigDecimal b new BigDecimal(0.1); System.out.println(b); // 輸出0.1字符串構(gòu)造會(huì)嚴(yán)格按照字符串的內(nèi)容解析得到精確的十進(jìn)制結(jié)果。所以業(yè)界有一條鐵律不要用 new BigDecimal(double構(gòu)造優(yōu)先使用 new BigDecimal(String或 BigDecimal.valueOf()。那BigDecimal.valueOf(0.1)為什么也是安全的看一下源碼就不難理解public static BigDecimal valueOf(double val) { return new BigDecimal(Double.toString(val)); }valueOf內(nèi)部先把 double 轉(zhuǎn)成字符串再走字符串構(gòu)造路徑所以繞開了二進(jìn)制近似值的陷阱。這實(shí)際上就是官方幫你封了一層安全轉(zhuǎn)換。我把三種方式整理成一個(gè)對(duì)比表方便記憶構(gòu)造方式示例結(jié)果安全性new BigDecimal(double)new BigDecimal(0.1)0.1000000000000000055511151231257827021181583404541015625不安全new BigDecimal(String)new BigDecimal(0.1)0.1安全BigDecimal.valueOf(double)BigDecimal.valueOf(0.1)0.1安全2.2 從源碼理解 BigDecimal 的內(nèi)部結(jié)構(gòu)理解 BigDecimal 的精度機(jī)制關(guān)鍵在于它內(nèi)部的兩個(gè)核心字段intVal或者 Java 高版本中直接使用BigInteger表示未縮放值和scale。用公式表示就是BigDecimal 數(shù)值 unscaledValue × 10^(-scale)舉個(gè)例子new BigDecimal(123.45)中unscaledValue 是整數(shù)12345scale 是2也就是12345 × 10?2。new BigDecimal(0.1)則是1 × 10?1。這套設(shè)計(jì)讓任意十進(jìn)制小數(shù)都能被精確表示不再依賴二進(jìn)制近似。這也解釋了為什么equals方法會(huì)比較 scale兩個(gè)數(shù)值相同但 scale 不同的 BigDecimal在你眼里可能是同一個(gè)數(shù)在它自己看來(lái)身份不同。比如1.0是10 × 10?11.00是100 × 10?2數(shù)值相等但內(nèi)部表示不同。這個(gè)細(xì)節(jié)極其重要后面我會(huì)單獨(dú)展開講。從 JDK 9 開始 BigDecimal 的內(nèi)部實(shí)現(xiàn)做過(guò)升級(jí)核心存儲(chǔ)換成了BigInteger但對(duì)外行為和概念模型不變。理解unscaledValue scale這套模型就理解了 BigDecimal 的一切行為。3. 加減乘除與舍入規(guī)則業(yè)務(wù)里 90% 的操作在這里3.1 add/subtract/multiply 基本用法與鏈?zhǔn)秸{(diào)用BigDecimal 的加減乘操作接口非常直觀分別是add、subtract、multiply。關(guān)鍵要養(yǎng)成一個(gè)習(xí)慣每次運(yùn)算都要接收返回值因?yàn)樗且粋€(gè)不可變對(duì)象運(yùn)算結(jié)果不會(huì)修改調(diào)用者本身而是返回一個(gè)新對(duì)象。BigDecimal price new BigDecimal(19.9); BigDecimal count new BigDecimal(3); BigDecimal total price.multiply(count); System.out.println(total); // 輸出59.7 BigDecimal taxRate new BigDecimal(0.06); BigDecimal tax total.multiply(taxRate).setScale(2, RoundingMode.HALF_UP); System.out.println(tax); // 輸出3.58第二行里我用了鏈?zhǔn)秸{(diào)用multiply(taxRate)返回一個(gè)新 BigDecimal再繼續(xù)調(diào)用setScale。這種寫法在工作中很常見(jiàn)要注意順序別亂。好多初學(xué)者寫鏈?zhǔn)秸{(diào)用時(shí)會(huì)忘掉中間結(jié)果沒(méi)有接收導(dǎo)致后面取到的還是舊對(duì)象排查半天才發(fā)現(xiàn)是這回事。對(duì)于加法減法用法完全對(duì)稱。特別提醒一點(diǎn)如果要對(duì)金額做累加比如統(tǒng)計(jì)一批訂單的總金額推薦先初始化一個(gè)BigDecimal.ZERO然后循環(huán)往里面加BigDecimal sum BigDecimal.ZERO; for (Order order : orderList) { sum sum.add(order.getAmount()); }注意每一輪都要重新賦值給sum這是不可變對(duì)象的使用常識(shí)。有人會(huì)寫sum.add(order.getAmount())然后不接收循環(huán)結(jié)束后 sum 仍然是零這個(gè) bug 非常隱蔽。3.2 divide 的兩種形態(tài)與除不盡的異常除法是整個(gè) BigDecimal 中最容易出問(wèn)題的操作尤其是不指定精度時(shí)。看這個(gè)例子BigDecimal one new BigDecimal(1); BigDecimal three new BigDecimal(3); System.out.println(one.divide(three));運(yùn)行后直接拋出ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.因?yàn)?1 ÷ 3 的結(jié)果是無(wú)限循環(huán)小數(shù)BigDecimal 不知道你想保留多少位也不知道怎么舍入只能拋異常結(jié)束。解決方式是指定精度和舍入模式兩個(gè)參數(shù)幾乎是綁定出現(xiàn)的BigDecimal result one.divide(three, 4, RoundingMode.HALF_UP); System.out.println(result); // 輸出0.3333這個(gè)例子中4表示保留 4 位小數(shù)RoundingMode.HALF_UP表示四舍五入。Java 里除法的一個(gè)常見(jiàn)報(bào)錯(cuò)就是除不盡拋異常凡是代碼里出現(xiàn)divide的地方都應(yīng)該習(xí)慣性帶上 scale 和 RoundingMode。3.3 setScale 與七種舍入模式setScale是控制 BigDecimal 小數(shù)位數(shù)的核心方法。它有兩種常見(jiàn)形態(tài)bigDecimal.setScale(2); // 不指定舍入模式遇到無(wú)法精確表示時(shí)可能拋異常 bigDecimal.setScale(2, RoundingMode.HALF_UP); // 推薦指定舍入模式Java 8 開始RoundingMode取代了老的常量提供了 7 種模式。我把每種模式結(jié)合實(shí)際數(shù)值說(shuō)明白這樣你以后選型心里有數(shù)。舍入模式對(duì)正數(shù)的行為對(duì)負(fù)數(shù)的行為典型使用場(chǎng)景UP遠(yuǎn)離零方向舍入1.1→2遠(yuǎn)離零-1.1→-2極少用向上取整的場(chǎng)景DOWN趨向零舍入1.9→1趨向零-1.9→-1直接截?cái)嘈?shù)位CEILING向正無(wú)窮大方向1.1→2向正無(wú)窮大-1.1→-1結(jié)果不允許小于真實(shí)值FLOOR向負(fù)無(wú)窮大方向1.9→1向負(fù)無(wú)窮大-1.1→-2結(jié)果不允許大于真實(shí)值HALF_UP四舍五入2.5→3四舍五入-2.5→-3業(yè)務(wù)中最常用HALF_DOWN五舍六入2.5→2五舍六入-2.5→-2少見(jiàn)HALF_EVEN銀行家舍入2.5→23.5→4同左統(tǒng)計(jì)、金融算法中有時(shí)會(huì)用到業(yè)務(wù)系統(tǒng)里最常用的是HALF_UP理解起來(lái)就是小學(xué)學(xué)的四舍五入。HALF_EVEN銀行家舍入在金融統(tǒng)計(jì)中會(huì)用到它的原則是五入成雙當(dāng)數(shù)字正好處于中間值比如 2.5時(shí)舍入到相鄰的偶數(shù)目的是讓多次舍入產(chǎn)生的統(tǒng)計(jì)偏差趨于平衡。但普通計(jì)費(fèi)場(chǎng)景不需要這種高級(jí)策略HALF_UP是最穩(wěn)的選擇。注意setScale不止能縮小小數(shù)位數(shù)還能擴(kuò)大。比如new BigDecimal(3.1).setScale(3, RoundingMode.HALF_UP)的結(jié)果是3.100這個(gè)特性在需要對(duì)齊小數(shù)位做比較時(shí)很實(shí)用。4. 比較大小用 compareTo別用 equals4.1 equals 的 scale 陷阱接前面提到的內(nèi)部結(jié)構(gòu)來(lái)看一個(gè)讓人猝不及防的比較問(wèn)題BigDecimal a new BigDecimal(1.0); BigDecimal b new BigDecimal(1.00); System.out.println(a.equals(b)); // false System.out.println(a.compareTo(b) 0); // true數(shù)學(xué)上完全相等的兩個(gè)數(shù)equals卻返回 false。因?yàn)閑quals不僅比較數(shù)值還比較 scale。1.0的 scale 是 11.00的 scale 是 2內(nèi)部結(jié)構(gòu)不同結(jié)果就是 false。這是 BigDecimal 里最經(jīng)典的隱形坑之一。如果代碼里用equals判斷金額或者價(jià)格相等一旦兩個(gè)值的精度位數(shù)不一致即使數(shù)值相同也會(huì)被判為不同。我見(jiàn)過(guò)有人用數(shù)據(jù)庫(kù)查出一個(gè)1.00代碼里寫死1.0equals永遠(yuǎn)返回 false導(dǎo)致業(yè)務(wù)分支走錯(cuò)。排查了很久才發(fā)現(xiàn)問(wèn)題出在 scale 上。4.2 正確比較姿勢(shì)與排序應(yīng)用正確判斷數(shù)值大小的方式是compareTo它只比較數(shù)值本身忽略 scale 差異System.out.println(a.compareTo(b)); // 0表示相等 System.out.println(a.compareTo(new BigDecimal(2))); // -1表示小于 System.out.println(a.compareTo(new BigDecimal(0.5))); // 1表示大于compareTo的返回值語(yǔ)義和 Comparable 接口一致負(fù)數(shù)表示小于0 表示等于正數(shù)表示大于。這也讓 BigDecimal 天然支持排序。實(shí)際工作中常見(jiàn)的場(chǎng)景是列表按金額排序ListBigDecimal amounts Arrays.asList( new BigDecimal(39.90), new BigDecimal(129.00), new BigDecimal(9.90) ); amounts.sort(BigDecimal::compareTo); System.out.println(amounts); // 輸出[9.9, 39.90, 129.00]如果要在HashMap或HashSet里用 BigDecimal 當(dāng) key同樣要注意equals和hashCode是配套的。既然equals會(huì)對(duì)1.0和1.00返回 false那么它們?cè)?HashMap 中也會(huì)被當(dāng)作兩個(gè) key。如果業(yè)務(wù)上希望數(shù)值相等就視為相同 key最好統(tǒng)一精度后再入 Map或者用TreeMap配合compareTo來(lái)規(guī)避。4.3 判斷零值的正確姿勢(shì)判斷一個(gè) BigDecimal 是否為零很多人順手寫bigDecimal.equals(BigDecimal.ZERO)這又會(huì)踩到 scale 的坑。0.00在 equals 眼里和0不是同一個(gè)對(duì)象但業(yè)務(wù)上它們就是零。推薦兩種寫法bigDecimal.compareTo(BigDecimal.ZERO) 0; // 或者 bigDecimal.signum() 0;signum()方法返回 -1、0、1 三種狀態(tài)表示負(fù)數(shù)、零、正數(shù)效率高且沒(méi)有 scale 問(wèn)題。在判斷大于 0 時(shí)signum() 0也是一個(gè)很清晰的寫法。5. 格式化輸出與類型轉(zhuǎn)換toString 也可能出問(wèn)題5.1 科學(xué)計(jì)數(shù)法帶來(lái)的顯示問(wèn)題BigDecimal 在數(shù)值特別大或特別小時(shí)toString()會(huì)采用科學(xué)計(jì)數(shù)法展示??催@個(gè)例子BigDecimal number new BigDecimal(1E10); System.out.println(number.toString()); // 輸出1E10如果直接把這個(gè)結(jié)果拼進(jìn)短信、郵件、報(bào)表或者傳給前端展示會(huì)出現(xiàn)1E10這種讓人摸不著頭腦的顯示。正確做法是使用toPlainString()System.out.println(number.toPlainString()); // 輸出10000000000toPlainString()返回的永遠(yuǎn)是不帶科學(xué)計(jì)數(shù)法的普通十進(jìn)制字符串。凡是要把 BigDecimal 展示給用戶或?qū)懭霕I(yè)務(wù)單據(jù)我都統(tǒng)一走toPlainString()這是一個(gè)成本極低但收益很大的習(xí)慣。5.2 金額格式化與小數(shù)位對(duì)齊業(yè)務(wù)中最常見(jiàn)的格式化需求是保留兩位小數(shù)并加千分位。通常會(huì)配合DecimalFormat完成需要注意先設(shè)置好 BigDecimal 的精度再做格式化避免格式化階段引入意外BigDecimal amount new BigDecimal(12345678.9); DecimalFormat df new DecimalFormat(#,##0.00); System.out.println(df.format(amount)); // 輸出12,345,678.90有一個(gè)細(xì)節(jié)容易被忽視DecimalFormat默認(rèn)使用的舍入模式是HALF_EVEN不是HALF_UP。如果業(yè)務(wù)明確要求四舍五入必須手動(dòng)指定df.setRoundingMode(RoundingMode.HALF_UP);不設(shè)置的話2.5會(huì)被格式化成2而不是3這種問(wèn)題隱蔽性特別強(qiáng)通常要到最后的數(shù)據(jù)核對(duì)階段才會(huì)暴露。另外一個(gè)處理方式是從 BigDecimal 層面先完成精度控制再用字符串拼接這樣每一步都有明確邊界BigDecimal rounded amount.setScale(2, RoundingMode.HALF_UP); String result String.format(%,.2f, rounded);開發(fā)時(shí)也要避免讓 BigDecimal 繞道 double 去做格式化比如String.format(%.2f, bigDecimal.doubleValue())。這種寫法把 BigDecimal 轉(zhuǎn)換成了 double精度在轉(zhuǎn)換過(guò)程中就已經(jīng)丟失了格式化再好看都沒(méi)有意義。6. 項(xiàng)目實(shí)戰(zhàn)從工具類封裝到踩坑記錄6.1 我在項(xiàng)目中沉淀的 BigDecimal 工具類因?yàn)?BigDecimal 在代碼里出鏡率太高我習(xí)慣在項(xiàng)目里沉淀一個(gè)工具類把兜底邏輯集中管理。核心功能是安全轉(zhuǎn)換和空值兜底。下面是一個(gè)很實(shí)用的模板你直接可以拿去改改用public final class BigDecimalUtils { private BigDecimalUtils() { } public static BigDecimal toBigDecimal(Object value) { return toBigDecimal(value, BigDecimal.ZERO); } public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) { if (value null) { return defaultValue; } if (value instanceof BigDecimal) { return (BigDecimal) value; } if (value instanceof Number) { return BigDecimal.valueOf(((Number) value).doubleValue()); } try { return new BigDecimal(value.toString().trim()); } catch (NumberFormatException e) { return defaultValue; } } public static BigDecimal toBigDecimalQuietly(String text, BigDecimal defaultValue) { if (text null || text.trim().isEmpty()) { return defaultValue; } try { return new BigDecimal(text.trim()); } catch (NumberFormatException e) { return defaultValue; } } public static boolean isPositive(BigDecimal value) { return value ! null value.signum() 0; } public static boolean isZero(BigDecimal value) { return value null || value.signum() 0; } public static BigDecimal scaleTo2(BigDecimal value) { return value.setScale(2, RoundingMode.HALF_UP); } public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor) { return dividend.divide(divisor, 2, RoundingMode.HALF_UP); } }這個(gè)工具類里有兩個(gè)設(shè)計(jì)要點(diǎn)。第一toBigDecimal對(duì)參數(shù)是Number的情況使用BigDecimal.valueOf而不是直接強(qiáng)轉(zhuǎn)確保精度安全。第二所有轉(zhuǎn)換失敗的情況都返回默認(rèn)值避免調(diào)用方到處寫判空邏輯??罩羔樖?BigDecimal 使用中最常見(jiàn)的運(yùn)行時(shí)異常所以判空和兜底要前置到工具層。6.2 實(shí)際項(xiàng)目中踩過(guò)的三個(gè)典型坑我把自己在真實(shí)項(xiàng)目中遇到的三個(gè)問(wèn)題記錄在這里每一個(gè)都對(duì)應(yīng)一段痛苦的排查經(jīng)歷。第一個(gè)坑是數(shù)據(jù)庫(kù)字段類型與 BigDecimal 的映射問(wèn)題。MySQL 的decimal類型映射到 Java 的 BigDecimal 后scale 取決于表結(jié)構(gòu)的定義。如果數(shù)據(jù)庫(kù)字段是decimal(10, 2)查出來(lái)就是兩位小數(shù)如果字段是decimal(10, 4)查出來(lái)是四位小數(shù)。代碼里如果假設(shè)查出來(lái)的一定是兩位小數(shù)直接做展示會(huì)出現(xiàn)19.9000這種尾巴必須統(tǒng)一用工具類做setScale(2)。第二個(gè)坑是JSON 序列化與反序列化的精度丟失。早期項(xiàng)目用 Fastjson 或 Gson 時(shí)如果沒(méi)有注冊(cè)針對(duì) BigDecimal 的序列化器反序列化過(guò)程可能先把 JSON 中的數(shù)值轉(zhuǎn)成 double再轉(zhuǎn)成 BigDecimal精度直接受損。一個(gè)保底方案是JSON 里金額字段統(tǒng)一用字符串類型傳輸Java 側(cè)接收為 String 再做轉(zhuǎn)換徹底繞開中間態(tài)。如果用 Jackson也可以配置把 BigDecimal 序列化為字符串保證傳輸過(guò)程中不被 JS 精度問(wèn)題二次傷害。第三個(gè)坑是在循環(huán)里頻繁創(chuàng)建 BigDecimal 對(duì)象導(dǎo)致性能問(wèn)題。BigDecimal 是不可變對(duì)象每次運(yùn)算都會(huì)產(chǎn)生新對(duì)象在循環(huán)里如果每次創(chuàng)建新對(duì)象而不復(fù)用GC 壓力會(huì)明顯上升。比如在百萬(wàn)級(jí)數(shù)據(jù)量下計(jì)算平均值先把所有值累加為 BigDecimal再做一次除法而不是每筆數(shù)據(jù)都做一次除法。對(duì)于性能敏感的場(chǎng)景要評(píng)估是否可以用 long 以分為單位存儲(chǔ)金額讓計(jì)算發(fā)生在整數(shù)域里最后除以 100 轉(zhuǎn) BigDecimal犧牲一點(diǎn)代碼直觀性換取極高效率。6.3 不可變性的正確理解BigDecimal 是不可變對(duì)象這一點(diǎn)在 Java 里和 String 完全一致。任何add、subtract、multiply、divide、setScale操作都不會(huì)修改原對(duì)象而是返回一個(gè)新對(duì)象。理解不可變性對(duì)編寫正確代碼非常重要BigDecimal a new BigDecimal(10); BigDecimal b a.add(new BigDecimal(5)); System.out.println(a); // 10a 沒(méi)有變 System.out.println(b); // 15如果你需要的是修改后的結(jié)果必須接收返回值。這個(gè)特性也讓 BigDecimal 天然線程安全因?yàn)樗鼪](méi)有內(nèi)部狀態(tài)可以被修改。多個(gè)線程共享同一個(gè) BigDecimal 實(shí)例時(shí)不需要額外的同步處理。這在并發(fā)編程里是一個(gè)加分項(xiàng)面試時(shí)經(jīng)常被問(wèn)到BigDecimal 是線程安全的嗎答案就是它是不可變對(duì)象所以是線程安全的。7. 面試官視角的 BigDecimal 高頻問(wèn)題7.1 六個(gè)常考問(wèn)題及回答要點(diǎn)我參與過(guò)不少技術(shù)面試也問(wèn)過(guò)候選人 BigDecimal 相關(guān)的問(wèn)題。整理幾個(gè)高頻問(wèn)題列出我認(rèn)為合理的回答要點(diǎn)。問(wèn)題一為什么不能用 float 或 double 表示金額回答要點(diǎn)float/double 采用二進(jìn)制近似表示十進(jìn)制小數(shù)很多小數(shù)無(wú)法精確表達(dá)運(yùn)算會(huì)產(chǎn)生誤差在金額計(jì)算中可能導(dǎo)致對(duì)不上賬。BigDecimal 采用unscaledValue × 10^(-scale)的方式精確表示十進(jìn)制數(shù)值可以滿足精度要求。問(wèn)題二new BigDecimal(0.1)和new BigDecimal(0.1)有什么區(qū)別回答要點(diǎn)前者接收 double 的二進(jìn)制近似值并如實(shí)轉(zhuǎn)換結(jié)果是一長(zhǎng)串精度污染后的數(shù)值后者按字符串內(nèi)容精確解析得到0.1。線上代碼必須用字符串構(gòu)造或BigDecimal.valueOf。問(wèn)題三兩個(gè) BigDecimal 比較相等用什么回答要點(diǎn)compareTo忽略 scale比較的是數(shù)值本身equals會(huì)同時(shí)比較 scale。業(yè)務(wù)上判斷金額相等應(yīng)該使用compareTo 0或者用signum() 0判斷是否為零。問(wèn)題四BigDecimal 除法拋 ArithmeticException 是什么原因如何處理回答要點(diǎn)不指定舍入模式時(shí)如果除不盡結(jié)果是一個(gè)無(wú)限循環(huán)小數(shù)BigDecimal 無(wú)法確定保留位數(shù)就拋異常。處理方式是指定帶的scale和RoundingMode如divide(divisor, 2, RoundingMode.HALF_UP)。問(wèn)題五BigDecimal 是線程安全的嗎回答要點(diǎn)BigDecimal 是不可變對(duì)象所有運(yùn)算都會(huì)返回新對(duì)象不會(huì)修改內(nèi)部狀態(tài)所以在多線程環(huán)境下可以安全共享。這與 String 的設(shè)計(jì)類似。問(wèn)題六1.0和1.00用 equals 比較結(jié)果是什么為什么回答要點(diǎn)結(jié)果是 false。equals不僅比較數(shù)值還比較 scale。1.0的 scale 為 11.00的 scale 為 2內(nèi)部表示的 unscaledValue 不同。這是 BigDecimal 最容易踩坑的細(xì)節(jié)之一。7.2 回答面試題的小技巧面試中回答 BigDecimal 問(wèn)題時(shí)除了正確性展示你對(duì)原理的理解會(huì)加分。比如被問(wèn)到為什么 0.1 0.2 不等于 0.3比起直接說(shuō) float 有精度問(wèn)題更好的回答是先說(shuō)明二進(jìn)制表示十進(jìn)制小數(shù)的局限性再講 BigDecimal 的實(shí)現(xiàn)原理最后補(bǔ)一句實(shí)際開發(fā)中的最佳實(shí)踐字符串構(gòu)造、compareTo 比較、divide 帶舍入模式。這樣從原理到實(shí)踐都覆蓋了面試官能立刻感受到你的經(jīng)驗(yàn)深度。如果被問(wèn)到工具類設(shè)計(jì)這類開放性問(wèn)題可以把前面那個(gè)BigDecimalUtils的思路講出來(lái)判空兜底、統(tǒng)一精度、安全除法。這種問(wèn)題沒(méi)有標(biāo)準(zhǔn)答案考察的是編碼習(xí)慣和工程意識(shí)能說(shuō)出這幾個(gè)維度就說(shuō)明你在真實(shí)項(xiàng)目里是思考過(guò)的。寫在最后的心得BigDecimal 用起來(lái)不難但做到零坑需要把原理和邊界都摸透。我個(gè)人的習(xí)慣是金額字段一律 BigDecimal構(gòu)造優(yōu)先用字符串或valueOf比較統(tǒng)一用compareTo除法必須帶精度和舍入模式對(duì)外展示用toPlainString。這些習(xí)慣看起來(lái)瑣碎但就是它們攔住了一次又一次的線上事故。最后提醒一點(diǎn)不要在一個(gè)項(xiàng)目里混用 BigDecimal 的多種構(gòu)造方式。定好規(guī)范、寫在團(tuán)隊(duì)開發(fā)手冊(cè)里、讓每個(gè)新人都從規(guī)范開始寫比等到線上出了精度預(yù)警再回頭收拾要省太多力氣。Java 基礎(chǔ)的東西就是這樣——越基礎(chǔ)越重要越重要越值得提前研究透。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
美女啊啊啊啊啊| 欧美日韩大香蕉| 2020中文字幕| 狠狠爱夜夜| 992这里有精品| 在线五区| 69精品少妇一区二区三区蜜桃| 美女露胸露奶头| 肏逼视频日本| 欧美在线l亚洲| 岛国免费视频在线| 亚洲一二三四区在线免费看视频| 日本一级一级一级一级| 91精品国产91久久青草| 日韩欧美丝袜诱惑| 婷婷五月天成人网| 亚洲天天综合| 九九国产| 乱色视频中文字幕| 亚洲日韩电影| 美性中文综合网| a一区二区三区乱码在线| 久久精品天美| 男人的天堂VA| 久久久久久中文| 大香蕉久久| 人妻少妇三级| 日本精品88888888| 大香网伊人久久综合| 男人女人18禁片免费看网站| 欧美在线91| 超碰美国| 熟女高潮精品一区二区| 日本午夜福利视频| 黄色av一区二区在线| 欧美草草高清日韩视频| 久草精品国产蜜臀| 成人网欧美风情| 国产超碰| 中文字幕在线观看永久| 亚洲精品自拍| 秋霞一级A片黄色视频| 日本 情色 1区2区3区| 天天日骚逼熟女| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 天天综合色图| 插穴性爱视频在线观看| 久久精品熟妇丰满人妻99| 蜜臀99999| 蜜桃久久综合视频| 97亚洲国产影视| 青青草日逼视频| 91精品无码人妻系列| 日韩精品中文字幕人妻| 日韩99精品视频综合区| 亚洲av无码成人精品国产| 中文字幕在线高清男人的天堂| 国产精品一区二区三区,亚洲综合| 日本天天干天天操一区| 熟女探花啪啪| 国产精品高清2021在线| AV麻豆免费一区| 精品无码一区二区三区| 久久婷婷综合国际产色怕| 久久亚洲AV成人精品无码| 欧美片第一页| 国内精品久久人妻性色av| 亚洲欧美综合图片| 久久专区| av天堂手机版追回| 婷婷啪啪| 日韩无码服务区| 国产精品96久久久久久| 婷婷色导航| 欧美亚综合色图| 九九九九免费视频| 性欧美| 国产无码三级视频在线观看| 国产综合操逼高清| 天天色怡春院| 殴美色网| 国产黄色av大片网站| 五月天激情婷婷| 欧美另类色图片| 九九九久久久久| 四虎影视精品| 成人a大片在线观看| 亚洲日本激情| av影院十区| 97精品视频在线播放| 国产精品视屏| WWW黄片COM| 美日韩一卡二卡三卡免费人妻精品| 性色avv| 综合网亚洲1| 欧美爱三级日韩久久| a一区二区三区乱码在线| 大香蕉五月天| 日韩女优中文字幕| 狠久久| 丁香六月激情| 成人熟女区| 在线97视频| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 一卡二卡在线播放| 美女一区二区国产精品| 91精品成人| 欧美综合网1| 学生妹天天看| 亚洲AV成人无码久久精品播放| 伊人久久国产免费观看视频| 久久免费9| 超碰狠狠操| 欧美爱国产综合、| 97ai亚洲| 午夜男女爽爽爽在线视频 | 9Ⅰ老熟女| 五月激情综合网| 丝袜内射| 91视频伊人| 中文一区二区婷婷视频| 91精品人| 超碰 另类 欧美 | 韩国手机不卡无码三级视频| 欧美精品久久96人妻无码| 高清视频一区| 精品国产久热在线观看| 久热精品在线| 午夜偷拍久久熟女| 4虎在线视频| 日韩久久.一级黄色片| 成人网欧美风情| 性色av大全| 白 大 人妻 区 在线| 久久久久久久九九九九九九| 美女AV一区二区| 少妇xx精品| 青青11操操操操操操操操| 最新av在线| 强奸国产精品视频| 51一区二区三区| 自拍偷拍2025在线观看| 日本加勒比无码专区| 啊啊啊啊好疼| 青青草日逼视频| AAAA欧美日韩| 在线欧美亚洲| 亚洲91亚洲| 老熟妇一区二区三区…| 狠狠躁久久躁| 99在线观看无大码| 日韩中文字幕二区| 亚洲 日本 国产 综合| 欧美亚洲国产日本在线,久久精品国产| av在线免费一区二区| 老司机午夜精品福利视频一区二区| 国产三级日产三级韩国三级| 东京热av男人的天堂| 亚洲自拍天堂| 啊啊啊啊啊啊啊啊视频| 高清肉丝中文无码| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 色播五月丁香| 欧美一级A片在线看视频性色| 蜜臀久久99精品久久久久久成人小说| 久青草影院| 精品人妻一区二区三区日产乱码| 白丝在线一区| 熟妇人妻一区二区| 99热9| 亚洲网站一区二区在线| 亚洲丝袜二区在线| 黑人与人妻| 久久精品国产精品亚洲艾通辽熟妇 | 女人18精品一区二区三区| 亚洲。日韩。欧美| 9久久精品| 第四色奇米影视777| 97国产精品在线观看| 蜜臀av中字字幕网站| 男女一级A片大黄,一进一出| 国产aⅴ无码片毛片一级网站| 亚洲 欧美综合| 性色国产东北露脸精品视频| 发朗少妇买婬全视频中文| 亚洲制服aⅴ中文字幕| 搡老女人老91妇女老熟女| 欧洲亚洲人人爽爽视频| 97色色,97综合| 宅男91视频在线播放| 99操视频| av资源在线观看少妇| 老司机深夜18禁污污网站| 天天拍夜夜| 日本高清一本二本免费不卡| 久久熟女久| 欧美一二在线| 一区 欧美 日韩 麻豆| 女同在线视频一区| 九九热男人天堂| 激情综合网激情五月天| www.zbzhongsen.com| 亚欧日韩成人| 特级丰满少妇一级AAAA爱毛片| 久艾草在线精品视频在线观看| 超碰97 线线 在现| 欧美综合自拍| 一级做a爰片性色毛片久久| 午夜精品久久99蜜桃的功能章节| 亚洲情色视频| 97超碰人人操人人操| 亚洲欧美人妻| 亚洲色图欧洲| 校园春色五月天| 1区2区3区视频| 亚洲欧美综合| 天天干天天操天天操夜夜操天天操| 日韩乱伦视频| 伊人综合色网| 爱射综合| 欧美后进式| 日韩中文字幕二区| 色综合久| 成人熟女视频一区二区三区| 亚洲视频小说| 亚洲骚男同com| 久久成人精品| 蜜臀久久99精品久久久久| 日韩精品在线视频,日韩精品……| 欧洲精品二区| 国产精品999aaa| 99久久精品无码一区二区毛片免费| 无码不卡亚洲成?人片| 强奸乱伦 亚洲一区| 八戒午夜福利理论片| 最新av网站在线观看| 91社操逼| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 九九视品黄色| 操逼999| 欧美日韩亚洲少妇寂寞影院正在播放| 干少妇视频| 51久久夜色精品国产麻豆| 丁香九月 婷婷| 熟女视频久久| 超碰97玖玖爱| 男女啊啊啊| 国产成人精品必看| 色优久久| 欧美 亚洲 综合 制服 另类| 亚洲自拍另类丝袜综合| 国产精品一区二区麻豆| 人人做,人人操,人人摸| 综合激情五月天| www老逼91| 国产av强奸美女| 99热成人| 999熟女精品| 久久性爱视频免费看| 亚洲国产成人精品无码专区| 97精品国产97久久久久久户外免费| 嗯嗯啊啊视频一区二区三区| 亚洲Av诱惑| 日韩精品在线观看观看| 少妇天堂网络| 欧美激情激情xxxx欧美专区| 亚洲日韩成人性爱视频| 偷拍超碰| 东北毛片| 麻豆国产原创AV色哟哟 | 欧美视频一区二区在线| 熟啊v色欧美热| 91丝袜美女视频| 欧美性爱视频免费一区一A | 国产美女口爆吞精视频| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 亚洲精品国产av天美传媒| 亚洲丝袜诱惑| 裸体美女免费看网站青草| 伊人久久亚洲色欲综合网站 | 亚洲人在线成线成人| 青娱乐日韩无码| 国产久久一区二区| 亚洲激情综合另类男同| 欧色综合| 麻豆综合一区av| 久草久热| 亚洲无码偷拍| 国产一级久久久| 天堂v无码免费视频| 久久人妻办公室视频| 9精品久久久久| 欧美成人性爱视频大全| 97爱爱官网| 福利在线黄片| 99re99在线视频| 操婷婷逼| 亚洲色人阁| 精品久久視頻在线| 久久97超碰| 91蜜臀在线久久久久| 伊人操| 91老司机在线视频免费观看| 日韩欧美成人性爱在线| 欧美综合自拍成人自拍第二十页| 午夜精品久久久久久久久久久久久| 丁香六月婷婷久久综合| 蜜乳成人AV| 久久伦理视频久久大香蕉视频| 亚洲激情综合另类男同| 日韩大香蕉精品在线视频| 91人妻尻屄视频| 亚洲国产丝袜在线观看| 欧美日韩999| 亚洲黄色| 安徽熟妇视频| 大香网站| 九色黄站| 国产不卡中文字幕免费avi| 国模不卡| 91美女视频在线观看| 67194无码不卡| 天天日天天搞天天干| 日本成人A片网站| 成人在线午夜视频一区| 天天日天天操心| 99久久无码| 天天操天天日青青草超碰av| 亚洲第一页色| 性在久久久久久| 精品国产乱码久久久久久久久久毛片| 啊啊啊用力在线观看| 国产日韩在线播放av| 大香交| 91老熟女逼| 日日操丁香五月天| 91操熟女| 亚洲se电影| 久久嫩草国产成人一区| 国内三级自拍小视频在线观看 | 亚洲欧洲小说图片视频| 日韩人成网站在线播放| 国产成人 综合亚洲 天堂| 97超碰色中文字幕| 人人手机欧洲亚洲国产人妻| 五月综合色| 不卡av在线中文字幕| 青青五月天| 精品人妻一区二区乱码一区二区| 玖玖人人爱| 国产在线综合网| 日本三级韩国三级美三级91| 欧美熟妇乱码在线一区| 亚洲色图久久成人| 在线观看av区| AV一区观看| 大学生美女口爆| 亚洲欧美综合图片| 伊欧美综合视频| 精品九九国产无码| 欧美一级美片在线观看免费| 精品999999| 综合自拍| 日逼97| 97人人夜| 97在线日韩中文字幕| 色大香蕉97N| 2025亚洲男人天堂| 啊a一区在线| 五月香婷婷| 午夜大香蕉| 五月天大香蕉| 九月丁香| 亚洲天堂东京热| 九九热超碰| 97欧美久久久久久久| 超碰成人公开| 欧美爱爱97| 青娱乐啪啪视频| 久久香蕉国产线看观看亚洲女人 | 全国男人天堂网| 久久九九热| 久久久久久裸体| 亚洲国产丝袜在线观看| 99热日| 97在线观看免费视频l| 色好看av| 久久久久久久久久久久欧美日| 伊蕉97蜜桃97狠狠综合干| 美女淫穴| 97超碰色中文字幕| 国产乱码久久久| 欧美天天影院| 69麻豆天美| 色色毛片| 嗯嗯啊啊亚欧精品| 午夜后入| 亚洲色天堂九9| a啊啊啊啊啊啊啊啊一区二区| 欧美一区二区| a'v在线资源| 你懂的在线观看区国产| 超碰色男人操熟女| 久久无码电影| 天天操av懂色| 亚洲AV不卡在线观看尤物| 青青欧美| 色香欲综合| JIZZJIZZ亚洲女人被躁| 欧美精品一区二区少妇免费A片 | 欧亚第一综合网| 韩国嫰模上门援交视频| 国产成人五月天丁香花| 一中国女人毛片水真多| a v网站在线播放| 亚州国产精品乱| 中文字幕版| 蜜臀在线看片| 手机在线免费看的av| 成人免费福利在线观看| 少妇二级| 精彩久久中文| 视频国产成人精品日本亚洲18| 日本无码1| 大香蕉五月天婷婷| 99热在线不卡| 青青五月天| 久久性生大片免费观看性| 欧美黄色手机在线观看| AV一区观看| 99无码精品| 狠综合网| 成人精品在线免费视频| 91狼人| 国产亚卅97| 精品少妇99| 国产特级毛片AAAAAA高潮流水 | 91美女精品| 911av网站免费观看| 日韩欧美视频青青| 色九九九九九九| 国产乱伦亚洲色图高清无码| 夜夜操狠狠操| 欧美在线亚洲| 天天干天天操天天干天天操 | 欧美强奸乱能| 宗合情欲网| 97在线免费视频观看| 国产操逼逼网| 91高跟美女在线播放| 97精品国产| 四虎AV在线观看| 久9爱精品| 操操逼操操逼操操逼逼| 伊人aaa| 18禁止看精品中文字幕| 欧美熟爽综合| 日本欧美中文字幕| 青青操97| 国语av狠狠色丁香婷婷综合激情| 人人天天欧洲| 丰满人妻区一区二区三| 九九在线精品| 婷婷久月| 毛片视频白嫩| 欧美 精品国产制服第一页| 蜜桃臀av在线观看| 亚洲全色网| 天天欧美欧美亚洲网| 狠狠爱夜夜| 中文字幕啊啊啊在线观看视频| 日产精品久久久一区二区| 日本护士高潮| 91狠狠综合久久| 丝袜美腿诱惑亚洲欧美视频在线观看| 日韩9区| 亚码激情| 自拍偷拍国产欧美日韩韩| 91女网站| 八戒午夜福利理论片| 国产日韩精品suv| 国产老熟女| 天天躁日日躁AAAAXXXX国产 | 国产亲戚伦亲在线| 中文字幕免费在线观看| 久久久中文| 97爱爱爱| 91性感网站| 久久性爱大全| 欧美97在线欧| 九九热在线精品视频| 日日操丁香五月天| 天天夜夜rb| 999狠狠综合| 超碰国产精品无码| 99热欧美| 欧美狠狠弄| 逼逼逼逼操操操操操操操操操午夜剧场 | 国产午夜精品一区二区三区牛牛| 97在线国产精品| av天堂精品久久| 精品国产乱码久久久久久久| 欧美色66| 国产精品一区二区黄片| 成人国产视频在线观看| 精品中文一区二区| 久久久99久9| www.91逼逼.com| 巨乳特殊服务按摩| 91色伦综合| 色婷婷久久| 中文人妻av高清一区| 999热日韩精品| 国产极品久久久| 国产超碰| 国产操操日韩三级黄| 97超碰欧美精品| 极品久久久久久久久久久久久久| 日日夜夜天天| 最新国产亚洲精品精品国产亚洲综合 | 国产久久av| 校园春色五月天| 美女黄码视频午夜| 青青草在线视频人人想人人上| 极品尤物自安慰| 东京热一区二区中文字幕| 丁香7月婷婷| 10000部十八禁看电影| 大香蕉啪啪啪| 日韩激情啪啪| 中文字幕乱在线伦视频中文字幕乱码在线| 国产精品第一页国产大屁股视频免费区 | 蜜桃久久一区二区| 男人的天堂三级| 久久夜嗨| 欧美色图片91| 大香蕉碰碰| 国产AV久久久蜜爱影集| 日韩亚洲Av人人夜夜澡人人爽| 人人模人人看| 超碰在线一区| 免费视频一二三区| 东京太热男人的天堂久久久| 很狠操| 久草综合视频| 99热 按摩 日韩| 久久国产视频专区一二三| 韩日精品四区| 天天综合91在线| 九九成人| 人妻加勒比东京热| 91丝袜美女国产| 六月丁香五月婷婷| 九九内射在线| 久久精品导航| 99999国产| 国产免费内射视频| 78操B| 欧美综合亚洲综合| 极品肉射| 亚洲天堂精品日韩电影| 人人看黄色视频| 欧美人与动性人交a| 欧美国产精品久久九九| 亚洲中文字幕在现观看| 亚洲黄片免费在线播放| 素人一区二区三区日韩| 国内毛片婷婷六月色| 国产理论视频在线播放| 中文字幕aⅴ在线视频| 特级丰满少妇一级AAAA爱毛片| 欧美日韩精品一区二区三区高清| 久久精品中文字幕无码l| 亚洲情色中文字幕一区| 亚洲啪啪性视频| 婷婷五月影院| 蜜伊人色综合97| 久久久久久久国产| nuu12国产麻豆精品| 成人情色综合网| 色图四区| 免费福利视频中文字幕| 亚洲欧美日韩精品久久久一区二区| 爆操无码| 久草成人福利导航| 大香蕉宅男伊人| 懂色av中文字幕一区二区三区天美 | 一二三四视频中文字幕在线看| 精品九九国产无码| 国产无马av| 青青青操| 麻豆a'v电影| 青娱乐91| 日韩人妻一二三区视频| 99精品在线播放| 日韩精品三区四区| 丝袜美女诱惑 91 视频| 日韩性色| 天天舔天天日天天射| 18精品一二区| 无码直播久久久| 亚洲高清无码免费观看视频| 在线人妻熟女一区二区三区四区五区| 欧美成人国产精品| 日韩一级二级三级免费看完整版| 在线综合色| 婷婷亚洲中文字幕在线| 欧美一区二区三区成人性生活| 97干在线视频| 久久久亚洲欧美综合| 欧美另类色图片| 毛片麻豆91糖心精品毛情片| 欧美乱伦专区| 丁香五月久久| 久湿久久| 人人干黄色| 91国产精品在线看| 欧美丝袜美女电影一二三四区| 综合97| 久热大香蕉| 中亚黄色三级大片| ji熟女.com| 搡老女人老妇女老妇老熟女怎么读| 亚洲高清男人天堂| 成人麻豆av电影网站| 久久久久精| 超碰人人干天天射| 精品亚洲国产成人AV制服丝袜| caopeng97人妻| 97爱亚洲| 精品精品精品| 色97干| 五月丁香色综合| 懂色AV网| 亚洲精品视频在线| 四虎884| 日本肏逼视频在线观看| 色综合超碰超| 国产精品久久久久无码A√| 久久精品亚洲东京热色播| 蜜臀久久99精品久久久久| 婷婷五月色| 九久久九九久视频| 久久婷婷视频| 夜夜欧美| 精品国产乱码久久久久久久久1| 久久久青青草| 久久久久久亚洲精品不卡人乳| 久久久999国产精品| 99热国产| 天美91| 日本女厕偷拍| 成人26uuu| 日本大香蕉| 人人操人人插人www| 日欧毛片久久| 国产18精品亚洲精品| 人妻大香蕉| 国模精品一区二区三区苹果色戒 | 在线观看高清AV| 亚洲欧美setu| hd成人一区二区在线| 欧美日韩亚洲国产中文永久天天看| 伊人影院综合是一个与深夜成人在线| 天天草AV| 亚洲人人操| 人人操人人色网| 色诱avtt| 久精品无码av一区二免费国产在线观看 | 国产精品福利资源在线尤物| 大香蕉伊在线久草麻豆天堂故事| 中文字幕精品日韩中文字幕| 风间由美日韩欧美久久| 97九色人妻| 91精品亚洲内射孕妇| 久久九操在线观看| 五月丁香网站| 乱伦一区二区三区‘| 五月天亚洲网| 99国内精品| 欧美经典一区二区三区| 91久久国产精品| 亚洲在线欧美| 天堂涩涩| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 亚洲 欧美都市激情| av在线播放国产一区| 亚欧操逼片在线观看| 日韩美一区| www.久久最新地址| 久久久久夜夜夜夜| 天天影视之亚洲综合网| 18一区二区三区| 爆操无码| 亚洲欧洲日韩天堂av| 这里只有97精品| 色综和网| 四虎影视在线| 亚洲精品亚洲人成人网| 欧美一区二区日韩三区| 欧美亚洲特P| 91 亚洲情侣偷拍 久久| 99热综合在线| 97碰在线视频| 色嗨嗨在线| 69av一区二区三区| 91人人| 久99在线免费观看视频| 久久大陆| 精产国品一区二三产品| 色欧美天天| 精品一区二区亚洲国产| 人妻丰满熟妇一区二区三| 91性色| 欧美成97爱| 超碰视97中文| 激情人妻另类| 欧美大片天天看| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 国内毛片无码一级毛片| av绯色| 91丨九色丨国产丨人妻在线| 亚洲天天综合| 国产精品剧情| 777超碰| 午夜噜噜噜| 九草九九九| 激情四射五月天| 热久日综合| 欧美72网页| 九九成人精品| 91欧美长吊| 欧美狠狠弄| 亚洲图片欧美制度| 一区中文字幕二区日韩| 亚洲免费精品一区| 国产精品国产自产拍高清AV| 殴美牲| 中日无幕一二三四区| 久久久草成人网站久久久草成人久久久草久久久| 天天干天天操天天干天天操| 日本一区二区不卡精品| 人人爱人人操人人性| 强歼乱伦资源网| 乱伦日本色图AⅤ| 97国产高清视频在线观看| 成人三一级一片aaa| 亚洲成人无码影院| 99热在线观看| 综合五月婷婷| 国产乱码久久| 91色五月俺来也| 男插女青青影院| 日日做夜狠狠爱欧美黑人| 色眯眯av| 久久成人东京热人妻| 青青草公开在线免费不卡视频| 不卡视频一区蜜桃视频| 亚洲在线| 色五天伊人| WWW黄片COM| 蜜桃久久一区二区三区| 嗯嗯啊啊操死我| 操死我了嗯嗯嗯| 国产97在线播放| 九九草| 欧美日韩电影成人在线| 日韩少妇一区二区三区| 五月婷婷激情综合| 97超碰逼| 亚洲欧美视| 国产精品九九九| 欧洲欧美视频一区二区| 国产粉嫩出水在线播放| 91 手机在线播放 绯色| 级品肉射| 97欧美日韩综合| 黄色人人| 久久精彩免费视频| 亚洲欧洲色情高清| 五月天婷婷社区| 999精品国产高清一区二区| 91小视频| 久插综合| 粉嫩av一区二区三区天美传媒 | 国产九九久久久精品| 欧美亚州色的图| 欧美亚洲图片| 精品黑人一区二区| 熟妇艹鸡八| 快灬快灬 一下爽蜜桃在线观看| 日本性交操一区二区不卡系列| 精品v日韩欧美国产| 91N五十路| 91天天综合在线| 国产一区自拍欧美日韩| 嗯嗯啊中文字幕| 欧美精品欧美精品系列| av爱爱爱| 精品妇女一区二区三区| 精品女同一区| 久久性爱精品一区| 亚洲综合春色| 九久久九九久视频| h无码动漫在线观看| 宗合情欲网| 国产日韩久久| 伊人久久婷婷| 欧美亚洲清纯| 亚洲国产婷婷在线播放| 手机av天堂久久久久| 一本大道青青| 人妻aa| 熟女精品一区二区在线观看| 午夜小电影在线插入淫高潮 | 免费试看60秒| 91五月天| 青青草色AV| 亚洲码专区| 91国精产品| 欧美一级A片不卡视频。| 亚洲日本男人天堂网| 国产乱子伦久久精品综合一区二区三| 毛片电影一区二区三区| 中文字幕一区二区三区蜜桃视频| 波多野结衣被操50分钟免费视频| 欧美性区| 亚洲无码超碰免费| 天天日日本| 亚洲av噜噜噜噜噜噜| 91亚州日韩高清| 欧州91高潮| 蜜桃色色网站视频三区| 上特色A在线| 欧亚洲精品有视频| 女人天堂av在线播放| 欧洲无码一区二区| 一起草高清无码| 亚洲精品丝袜| 99亚洲精品| 日韩在线97| 岛国片国产成人亚洲播放| 97在线观看免费视频l| 精品高清一区二区三区三州| 欧美午夜视频| 天天天天天天天天天天干美女| 欧美玖玖爱免费玖玖| 午夜久久无码1000合集| 欧美美逼| 2001天天操| 草莓精品视频在线免费观看| 91超碰碰在线| 人成午夜免费大片| 男女啊啊啊啊啊| 91久久精品国产| 欧美大香蕉久| 国产精品色| 91美女中出| 日韩免费福利在线观看| 天天拍天| 三级三级三级日本99| 国产粉嫩蜜臀av一区二区三区| 国产91精品久久久久久久网曝门| 少妇xx精品| 久草免费在线视频| 欧美精品丝袜久久久中文字幕| 午夜操逼不卡| 亚洲AV色图| 人妻一区久久二区三区色播| 欧美亚洲尤物久久| 超碰吊日色| 97玖玖超碰| 精品人妻美妇91job| 久久97超碰| 国产一区二区精品在线视频| 国产精品一二三区福利| 亚洲av综合伊人久久| 粉嫩久久久极品| 超碰调教97| 91久久精品中文字幕| 中文字幕第2页| www.男人天堂| 日本人体九九九九九九| 综合操逼| 精品无码久久久久久久杏吧| 少好三P| 日韩欧亚太美不卡| 97欧美资源| 97免费视频网| 国内91熟女人妻丝袜天天精品视频在线| 国产精品福利视频播放| 一区二区三区一亚洲中文字幕、综合区灬| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 91丨九色丨东北熟女| 操逼免费视频无码国产| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 成人免费在线网站| 欧美性爱精品七区| 91精品导航| 久久久内射良家| 日韩欧美被操黄免费观看| 五月婷婷综合网| 亚洲欧美国产其他二区| 粉嫩av久久一区二区三区| 97超碰中文在线| 99热线麻豆| 小草av不卡亚洲二区 | 亚洲精品无码成人久久久99| 青春草莓视频在线观看网址| 久久日韩肥臀| 蜜臀一二三区| 亚洲综合69| 青青草日本中文字幕| 花野真衣| 98色网| 久久婷婷五月综合| 国内自拍 日韩激情 99| 亚洲色色探花| 伊人黄色片| 久久在线观看免费视频| 人人操欧美风骚| 国产91 丝袜在线播放00-百度| 九九五月天| 欧美综合亚洲| 涩亚洲欧洲| 日本精品一区二区三| 97国产伦理| 啊嗯嗯啊好大好爽| 色悠久久久av| 伊人96在线| 九久久精品| 一本大道久| 我要色综合网站| 天堂亚洲欧美| 夜夜爽夜夜高潮夜夜爽| 亚洲AV色图| 亚洲情色视频| 久久久精品| 国产精品白领在线观看| 欧洲综合视频| 91人妻人人澡人人爽人人精品| 黄色av一区二区在线| 亚洲成人无码影院| 久久久一区二区三区三州| 校园春色五月天| 97在线免费看视频| 91综合天天看| 97爱爱官网| 四虎影视精品| 97超碰欧美手机| 男人天堂网站| 超碰78| 日本操逼aaaaa| 三级激情网站| 精品人体无圣光凹凸| 91碰超| 91黑人无码激情在线| 韩国一级做A片免费的| 丁香五月激情啪啪| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 诱惑人妻欧美一区在线播放| 丁香激情网| 欧美亚洲美少妇一区二区| 青青草成人视频在线观看二区| 99www.bibizy香蕉资源国产一区二区三区高清| 欧美另类色| 天天日天天射天天干| 九九热午夜欧亚国产视频| 国产中午字一暮区| 色亚洲欧美| www.99热| 久草五月| 亚洲国男人的天堂| 91国产大片| 久久超碰com| 日本免费中文字幕在线| 亚洲精品影视老司机| 91九色精品熟女内射| 操一区| 日夜久久久九九九久| 欧美激情在线观看视频| 热久久国产| 99精品视频在线观看免费| 无码不卡亚洲成?人片| 天天躁日日躁成人字幕aⅴ| 亚洲高清视频在线免费观看| 99国产女人| 自拍偷拍 日韩欧美| 色五月激情网| 9999久久久久| 国产日韩欧美亚洲精品95| 操人妻少妇中文 | 人妻-91porn| 青青伊人加勒比海| 久久性生大片免费观看性| 免费看日本操逼视频| 一二视频神马久久传媒| 日本性爰一道本| a片亚洲一本通视频| 免费家庭乱伦视频| 伊人色综合超碰| 一本精品日本在线视频精品| 99国产精品人妻人伦| 97干在线视频| 美女尤物福利视频| 97欧美视频| 熟妇一区二区三区| 国产网红精品| 干妹子| 无码99| 久久国产成人精品国产成人亚洲| 玖玖97综合| 99久久婷婷丁香| 中文字幕无码不卡啪啪| 色色五月婷| 国产精品女aA片爽爽视频| 成人无码专区精品视频| 亚洲av综合色| 超碰99在线| av情色影音| 国产精品亚洲免费| 国语少妇精| 熟女一区二区三区| 色色五月天婷婷| 成人av影院在线观看| 妇女乱色二区| 色综合加勒比四四季| 影音先锋中文字幕日本好一区二区| 91美女视频直播| 亚洲免费97免费| 大胆91| 婷色五月| 美国人人操人人操| 九九九九精品| 欧美中日韩XXXX| 99热日| 性老妇一区二区三区| 久久理论字幕视频| 翔田千里av一区二区三区| 被男人吃奶很爽的毛片| 成人久久久| 色偷偷2020免费视频播放| 99xav| 欧美日韩一干二干| 久久久久久久久久久人妻| 青青草影视蜜久久| 青青草成人视频在线观看二区| 色综合99999| 久久永久无码人妻视频| 精品在线观看视频在线| 宅男91视频在线播放| 精品免费成人久久| 激情国产乱伦Av| 人人操AV| 狠狠久久亚洲欧美专区| 五月丁香激情综合| 激情综合五月| 久热伊人99re| 亚洲熟妇熟在线电影视频| 日本97久久久精品| 99re这里| 亚洲综合射| 亚洲综合嫩| 男人的天堂va在线| 日韩性爱小视频| 欧美成人免费在线观看| 中日韩久久久| 免费观看性欧美一级| 深夜激情| 天堂射| 欧美大战久久久伊人| 91情色在线| 福利五区| 久久久亚洲熟妇资源| 日本一久是| 九九九九一区| 淫穴高潮色图| 熟女少妇一区二区三区| 天天久久| 中文字幕aⅴ在线视频| 99视频内射三四| 97超碰色屌| 91蜜臀人妻中文字幕在线| 亚洲最新Av| 欧美综合区| 欧亚久久偷拍视频| 成人小电影网站tex| 综合五月婷婷亚洲一区| 五月天婷婷成人网| 激情视频图片| 91精品久久久| 99热99re超碰精品| 91欧美情色| 九九探花视频在线观看| 天天日天天舔东京热| 亚洲欧美另类激情小说| 国产精品久久久久久久久AV大片| 97中文字幕色| 男人在线天堂| 五月婷婷综合网| AV女资源| 99操视频| 亚洲少妇视频| 99自拍视频在线观看| 亚洲AV色图一区| 久久免费精品视频免一| 东方亚洲在线操逼天堂| 黄片色区软件| 精品人妻伦一区二区三区久久| 亚洲精品人妻在线| 久久↗↗| 日韩中文字幕视频在线观看| 人妻喷水| 丁香五月婷婷基地| 亚洲欧美999| 欧中日成人免费影视| 国产黄色影片在线观看| 啊啊啊啊操死我了| 操逼1区| 青青草在线视频美女| 黄污污污污| 一个国产在线综合网站| 日本中文字幕熟妇| 伊人AAA| 国产亚洲深夜激情| 九九九只有精品| 高凊专区人人操| 99色热国产视频精品| 五月天婷婷社区| 亚洲色性情三级| 婷婷爱五月| 91影库| 网友自拍第一页| 色69大色97香蕉| 蜜桃中文字日产乱幕4区| 国产成人精品日本亚洲语言| 欧美精品二区视频在线| 欧美日本不卡| 日产中文字幕2020| 五月天成人综合| 午夜偷拍久久熟女| 亚洲成人在线高清| 久久精品72| 自拍偷拍2025在线观看| 国产剧情AV不卡在线观看| 99久久久er直播网址| 伊人久操| 中亚av| 蜜桃精品一区二区三区ww| 中文字幕亚洲热播人妻| 97免费视频在线| 欧美日韩狠狠爱| 60秒免费小视频| 日韩AV一区二区三区三州三州| 午夜福利视频在线一区| 69少妇一区二区| 翔田千里爆乳巨臀无码| 国产传媒一区二区三区| 亚洲蜜臀精品视频久久|