在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/ Java問(wèn)答
擱淺 回答

原因:浮點(diǎn)數(shù)的精度問(wèn)題。

轉(zhuǎn)為整型

clipboard.png

注意:

  1. 向下取整,即:12910.9 會(huì)被轉(zhuǎn)換為 12910

    <?php
    var_dump(intval(12910.9));
    
    // 輸出
    // int(12910)
  2. 浮點(diǎn)數(shù)精度
    clipboard.png

    看如下執(zhí)行結(jié)果:
    clipboard.png
    我們知道:$receive_money 值小于 12911

總結(jié):所以,最后 $receive_money 轉(zhuǎn)換為整型時(shí),向下取整,結(jié)果為:12910

參考:


問(wèn)題補(bǔ)充:

為什么 float(12911) 沒(méi)有顯示成 12910.9999... 呢?

這是由于浮點(diǎn)數(shù)的二進(jìn)制表示形式?jīng)Q定的。
看如下示例:

clipboard.png

我們看到第 9 行代碼 float(12911) 擴(kuò)展整數(shù)位之后,轉(zhuǎn)換成整型表示:int(129109999)。
然后,我們對(duì)比了 float(12911)int(12911) 在二進(jìn)制上的差別。
是不是發(fā)現(xiàn)了什么?(二進(jìn)制的最后一位)這是 PHP-bug 么?當(dāng)然不是。
而且我們同樣也注意到了第 8 行代碼輸出結(jié)果為:float(129110000),這又是為什么呢?
為什么不是 float(129109999)呢?

我們看一下 PHP 源碼中浮點(diǎn)數(shù)是什么:
clipboard.png
如圖:php-float 等于 c-double
我想如下幾個(gè)問(wèn)題可以解決上述的疑問(wèn):
雙精度浮點(diǎn)數(shù) 的二進(jìn)制形式是如何表示的呢? 請(qǐng)參考:wikipedia-雙精度浮點(diǎn)數(shù)
浮點(diǎn)數(shù)是如何處理乘法運(yùn)算的呢? 請(qǐng)參考:wikipedia-浮點(diǎn)數(shù)的乘法和除法

如果上邊兩個(gè)問(wèn)題不愿深究,可以直接參考鳥哥的一篇博客:PHP浮點(diǎn)數(shù)的一個(gè)常見(jiàn)問(wèn)題的解答

以上為個(gè)人理解,如果錯(cuò)誤之處,請(qǐng)指出。

哚蕾咪 回答

如果評(píng)論里的邏輯是對(duì)的。應(yīng)該做有改無(wú)增的操作,而id不同的時(shí)候你并沒(méi)有push。

// 簡(jiǎn)化版本
var miniCartListArr = []
var miniId = {}
function dataHandler (opt) {
    if (miniId[opt.skuId] !== undefined) {
        // 有改
        miniCartListArr[miniId[opt.skuId]] = opt
    } else {
        // 無(wú)增
        // 存 id:索引,方便下次有改
        miniId[opt.skuId] = miniCartListArr.length
        miniCartListArr.push(opt)
    }
}

arr2 = [...arr1]
這么寫并不是個(gè)真的深拷貝。

var arr1 = [{name:1}]
arr2 = [...arr1]
arr2[0].name = 2
arr1[0].name // 1
arr1 === arr2 //false
arr1[0] === arr2[0] //true
瘋子范 回答

去看看是不是開啟了vhosts,/etc/httpd/conf.d/httpd-vhosts.conf

赱丅呿 回答

稍優(yōu)化了一點(diǎn),按你的算法,有n個(gè)元素的數(shù)組,要循環(huán)

n * n * in_array里的次數(shù),in_array內(nèi)部也是循環(huán)
var arr = [1, 2, 5, 6, 7];//如果這個(gè)數(shù)組不是有序數(shù)組,哪還要先加排序
var len =arr.length

let result=[]
let count=0

for(let a=0;a<len;a++){
let max = arr.pop()
let newlen = arr.length
for(let i=0;i<newlen-1;i++){
   if(arr[i]+arr[i+1]> max){
    break;
  }
  for(let j=i;j<newlen-1;j++){
    let plus = arr[i]+arr[j+1]
    count++
    if(plus>max){
      break;
    }
    if(plus==max){
      result.push([max,arr[i],arr[j+1]])
    }
  }
}
}
console.log(result)//輸出結(jié)果
console.log(count)//輸出總循環(huán)次數(shù),

回復(fù)里說(shuō)的好,我沒(méi)有考慮負(fù)數(shù)的情況,如果要考慮負(fù)數(shù),哪把最大數(shù)pop出來(lái),就不行了,只能重新維護(hù)一條新數(shù)組,用來(lái)枚舉所有值,修改如下

var arr = [-8, -1, 1, 2, 5, 6, 7];//如果這個(gè)數(shù)組不是有序數(shù)組,哪還要先加排序
var len =arr.length
var arr1 = [...arr] //復(fù)制一條新數(shù)組
let result=[]
let count=0

for(let a=0;a<len;a++){
let max = arr1.pop()// 從新數(shù)組中枚舉各個(gè)值。
let newlen = arr.length
for(let i=0;i<newlen-1;i++){
   if(arr[i]+arr[i+1]> max){
    break;
  }
  for(let j=i;j<newlen-1;j++){
    let plus = arr[i]+arr[j+1]
    count++
    if(plus>max){
      break;
    }
    if(plus==max){
      result.push([max,arr[i],arr[j+1]])
    }
  }
}
}
console.log(result)//輸出結(jié)果
console.log(count)//輸出總循環(huán)次數(shù),
輸出
[[7, 1, 6], [7, 2, 5], [6, -1, 7], [6, 1, 5], [5, -1, 6], [1, -1, 2], [-1, -8, 7]]
旖襯 回答

參考這篇文章,我來(lái)翻譯一下:

這是一個(gè)方法,它具有原子性:

    public int getVector() {
        int index = vector.size() - 1;
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return vector.get(index);
    }

這也是一個(gè)方法,它也具有原子性:

    public void deleteVector() {
        int index = vector.size() - 1;
        vector.remove(index);
    }

所謂原子性,就是方法里的語(yǔ)句會(huì)順次執(zhí)行,不會(huì)被打斷。

但是你把它倆復(fù)合起來(lái),它就不再是原子的了:

    public static void main(String[] args) {
        VectorTest vectorTest = new VectorTest();
        new Thread(new Runnable() {
            public void run() {
                vectorTest.getVector();
            }
        }).start();
        new Thread(new Runnable() {
            public void run() {
                vectorTest.deleteVector();
            }
        }).start();
    }

在這里開了兩個(gè)線程,一個(gè)執(zhí)行第一個(gè)方法,另一個(gè)執(zhí)行第二個(gè)方法,第一個(gè)方法一上來(lái)先獲取了向量的尺寸,然后就開始休眠了,趁第一個(gè)方法不注意,第二個(gè)方法進(jìn)來(lái)刪除了向量里最后一個(gè)元素,等第一個(gè)方法醒過(guò)來(lái),再想找最后一個(gè)元素找不著了,就拋出錯(cuò)誤了,所以復(fù)合操作不具有原子性,中間被插入打斷了。

解決的方法就是加個(gè)鎖:

    public int getVector(){
        synchronized (vector) {
            int index = vector.size() - 1;
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return vector.get(index);
        }
    }

synchronized就是同步的意思,同步的意思是說(shuō)這一步邁不完,下一步不能開始,所以這樣就保證了整個(gè)操作依然是原子級(jí)的,不存在被插入的可能。

通過(guò)閱讀Javac編譯器的源碼, 我們知道編譯器在把Java程序源碼編譯為字節(jié)碼的時(shí)候,會(huì)對(duì)Java程序源碼做各方面的檢查校驗(yàn)。這些校驗(yàn)主要以程序“寫得對(duì)不對(duì)” 為出發(fā)點(diǎn), 雖然也有各種WARNING的信息, 但總體來(lái)講還是較少去校驗(yàn)程序“寫得好不好” 。 有鑒于此, 業(yè)界出現(xiàn)了許多針對(duì)程序“寫得好不好” 的輔助校驗(yàn)工具, 如CheckStyle、 FindBug、 Klocwork等。 這些代碼校驗(yàn)工具有一些是基于Java的源碼進(jìn)行校驗(yàn), 還有一些是通過(guò)掃描字節(jié)碼來(lái)完成。

出自深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐(第2版)——10.4.1節(jié)

焚音 回答

public class test {
public static List> source;

public static void main(String[] args) {

source = new ArrayList<>();

List<String> a = new ArrayList<String>();
a.add("黑色");
a.add("白色");
List<String> b = new ArrayList<String>();
b.add("64G");
b.add("128G");
List<String> c = new ArrayList<String>();
c.add("中國(guó)聯(lián)通");
c.add("中國(guó)移動(dòng)");
source.add(a);
source.add(b);
source.add(c);
ArrayList<String> result = new ArrayList<>();
recursion(result, source.get(0), 0, "");
System.out.println(result);

}

public static void recursion(List<String> result, List<String> para, int num, String choose) {

for (int i = 0; i < para.size(); i++) {
    if (source.size() == num + 1) {
        result.add(choose + "/" + para.get(i));
    } else {
        recursion(result, source.get(num + 1), num + 1, choose + "/" + para.get(i));
    }
}

}
}

遲月 回答

基本上都只統(tǒng)計(jì)qps與tps。

其實(shí)工具和語(yǔ)言沒(méi)關(guān)系。

像大眾點(diǎn)評(píng)的cat,韓國(guó)的pinpoint都是可以做到的。

還有其他,像nginx accesslog或者通過(guò)打日志,收集到es也能做到。

或者有一些框架自帶,不過(guò)局限性比較大,只能看單服務(wù)的,不能匯總到一個(gè)地方查看,就不建議使用了。

陪妳哭 回答

web服務(wù)器都有正常停止功能,你kill -9是幾個(gè)意思?

你關(guān)電腦都是直接拔電源嗎?

孤客 回答

這個(gè)沒(méi)有使用過(guò)第三方平臺(tái),我覺(jué)得這樣看你的第三方平臺(tái)是什么樣的,比如你的金額花的比較大,第三方有可能幫助你上線,不然我覺(jué)得需要審核上線的

挽歌 回答

p到底是Promise,還是是函數(shù)?如果pPromise,會(huì)有不好的影響,否則不會(huì)。

當(dāng)前V8的Promise的實(shí)現(xiàn),會(huì)在滿足以下條件的時(shí)候回收掉所有.then鏈的上下文

  1. resolve沒(méi)人要了
  2. reject也沒(méi)人要了
  3. !!Promise對(duì)象也沒(méi)人要了

所以以下代碼完全沒(méi)有問(wèn)題,所有東西都會(huì)被正確回收

let collectable = (async () => {
  const buf = new Uint8Array(1024 * 1024 * 1024);
  for (let i = 0; i < buf.length; i++) buf[i] = i;
  await new Promise(() => { });
  return buf;
})();
if (typeof gc == 'function') gc();

上面的代碼中,1和2滿足,因?yàn)闆](méi)有變量存著那個(gè)空Promise,所以3也滿足,所以async內(nèi)的所有上下文都被釋放,collectable只剩下了空殼Monad,薛定諤的貓?jiān)缗艿袅恕?/p>

而這段代碼會(huì)造成內(nèi)存泄漏

let deadPromise = new Promise(() => { });
let uncollectable = (async () => {
  const buf = new Uint8Array(1024 * 1024 * 1024);
  for (let i = 0; i < buf.length; i++) buf[i] = i;
  await deadPromise;
  return buf;
})();
if (typeof gc == 'function') gc();

上面的代碼會(huì)造成內(nèi)存泄漏,只有deadPromise = null之后才能回收。


一點(diǎn)后話,我猜題主也是在想,如果我們沒(méi)有AbortablePromise,那我們至少能明確標(biāo)示出一個(gè)Promise可以被垃圾回收吧?幸運(yùn)的是,我們可以,但是要用到上面這樣的hack。

不過(guò),現(xiàn)在我們有AbortController了,說(shuō)明社區(qū)已經(jīng)基本上對(duì)AbortablePromise怎么實(shí)現(xiàn)有了共識(shí):應(yīng)該throw出去。這樣的話,我們就不應(yīng)該用這樣的hack了,而應(yīng)該與fetch它們保持一致。

玄鳥 回答

這個(gè)要說(shuō)起來(lái)就多了,網(wǎng)上有很多很多寫得很詳細(xì)的教程,隨便一搜就有的:https://wenku.baidu.com/view/...

逗婦惱 回答

這種情況下不報(bào)異常就是成功

茍活 回答

第二次請(qǐng)求戴上第一次請(qǐng)求返回的Cookie

故林 回答

個(gè)人理解,接口的返回結(jié)果是會(huì)寫到業(yè)務(wù)系統(tǒng)中的,后期不應(yīng)該根據(jù)日志的返回結(jié)果進(jìn)行大量的查詢。

mysql 5.7之后支持json類型,可以研究一下能否滿足你說(shuō)的查詢統(tǒng)計(jì)的需求。
mongodb不太熟悉,但我記得建議同一個(gè)collection中的schema是一致的。如果建多個(gè)collection,和mysql建多張表就沒(méi)區(qū)別了。