2017-11-19 6 views
0

Ich versuche zu entscheiden, ob ich eine bigint lib brauche oder die normalen js Zahlen werden genug sein. Ich möchte Dateigrößen mit Stückgrößen in Bits bis zu 100 GB teilen, um zu erhalten, wie viele Stücke ich habe: howManyChunks = Math.ceil(fileSize/chunkSize). Ich erinnere mich, dass js Probleme mit der präzisen Teilung hat.Javascript bigint Abteilung

Was ist die Chance, die ich x+1 = Math.ceil(x.00000000000..01) anstelle von x = Math.ceil(x.0) im Ergebnis bekomme?

+0

Da Ihr Wert "2.5" sein kann, werden Sie wahrscheinlich die Präzision verlieren ... –

+0

@JonasW. Es spielt keine Rolle bei 2.5, da das Ergebnis von "ceil" dasselbe sein wird. – inf3rno

Antwort

0

Ich entschied mich, es auszuprobieren. Die Genauigkeit der normalen js-Zahlen beginnt bei der Dateigröße von 3-4PB nicht zu reichen. In Firefox haben also Integer etwa 55 Bit Genauigkeit. Ich schätze, das kann von Browsern abweichen, aber ich brauche das für nodejs.

console.log("start"); 

var B = 8; 
var KB = 1024*B; 
var MB = 1024*KB; 
var GB = 1024*MB; 
var TB = 1024*GB; 
var PB = 1024*TB; 
var EB = 1024*PB; 

var maxBits = 4 * PB; 
var bitSteps = 100 * TB; 
var maxChunkSize = 333 * B; 

for (var bits = 0; bits <= maxBits; bits += bitSteps) 
    for (var chunkSize = 1; chunkSize <= maxChunkSize; ++chunkSize) { 
     var calculatedChunkCount = Math.ceil(bits/chunkSize); 
     var calculatedBits = calculatedChunkCount * chunkSize; 
     var difference = calculatedBits - bits; 
     var error = difference>= chunkSize || difference<0; 
     if (error) 
      console.log({ 
       chunkSize: chunkSize, 
       calculatedChunkCount: calculatedChunkCount, 
       bits: bits, 
       calculatedBits: calculatedBits, 
       difference: difference 
      }); 
    } 

console.log("end"); 

Ausgang:

{ chunkSize: 97, calculatedChunkCount: 290180388361501, bits: 28147497671065600, calculatedBits: 28147497671065596, difference: -4 } 
{ chunkSize: 1579, calculatedChunkCount: 20611490932343, bits: 32545544182169600, calculatedBits: 32545544182169596, difference: -4 } 

Ich werde einen parallel NodeJS Skript für Nacht beginnen, nur um sicher zu sein, aber ich denke, dass Präzision genug ist, im Bereich von 0 - 100 GB-Bereich.

Nach einer anderen Antwort: https://stackoverflow.com/a/2803010/607033 js Ganzzahlen sind bis zu 53 Bits genau. Also könnte diese Unterteilungsgrenze nahe bei diesem Wert liegen, vielleicht ein paar Bits niedriger.