Dela via


about_Numeric_Literals

Kort beskrivning

Den här artikeln beskriver syntaxen och användningen av numeriska värden i PowerShell.

Lång beskrivning

Det finns två typer av numeriska literaler: heltal och verkliga. Båda kan ha suffix för typ och multiplikator.

Heltalsliteraler

Heltalsliteraler kan skrivas i decimal- eller hexadecimal notation. Hexadecimala literaler prefix med 0x för att skilja dem från decimaltal.

Heltalsliteraler kan ha ett typsuffix och ett multiplikatorsuffix.

Suffix Innebörd
l lång datatyp
kb kilobytesmultiplikator
mb megabyte multiplikator
gb gigabytemultiplikator
tb terabytemultiplikator
Pb petabyte-multiplikator

Typen av en heltalsliteral bestäms av dess värde, typsuffixet och det numeriska multiplikatorsuffixet.

För en heltalsliteral utan typsuffix:

  • Om värdet kan representeras av typen [int]är det dess typ.
  • Annars, om värdet kan representeras av typen [long], är det dess typ.
  • Annars, om värdet kan representeras av typen [decimal], är det dess typ.
  • Annars representeras den av typen [double].

För en heltalsliteral med ett typsuffix:

  • Om typsuffixet är u och värdet kan representeras av typen [int] är [int]dess typ .
  • Om typsuffixet är u och värdet kan representeras av typen [long] är [long]dess typ .
  • Om dess värde kan representeras av den angivna typen är det dess typ.
  • Annars är den literalen felaktigt formaterad.

Verkliga literaler

Verkliga literaler kan bara skrivas i decimal notation. Den här notationen kan innehålla bråkvärden som följer en decimalpunkt och en vetenskaplig notation med hjälp av en exponentiell del.

Den exponentiella delen innehåller ett "e" följt av ett valfritt tecken (+/-) och ett tal som representerar exponenten. Till exempel är literalvärdet 1e2 lika med det numeriska värdet 100.

Verkliga literaler kan ha ett typsuffix och ett multiplikatorsuffix.

Suffix Innebörd
d decimaldatatyp
kb kilobytesmultiplikator
mb megabyte multiplikator
gb gigabytemultiplikator
tb terabytemultiplikator
pb petabyte-multiplikator

Det finns två typer av verklig literal: dubbel och decimal. Dessa indikeras av frånvaro eller närvaro av decimal-typ suffix. PowerShell stöder inte en literal representation av ett [float] värde. En dubbel verklig literal har typen [double]. En verklig decimalliteral har typen [decimal]. Avslutande nollor i bråkdelen av en verklig decimalliteral är betydande.

Om värdet för exponentdelens siffror i en [double] verklig literal är mindre än det minsta som stöds är värdet för den [double] verkliga literalen 0. Om värdet för exponentdelens siffror i en [decimal] verklig literal är mindre än det minsta som stöds är den literalen felaktigt formaterad. Om värdet för exponentdelens siffror i en [double] eller [decimal] verklig literal är större än det maximala som stöds är den literalen felaktigt formaterad.

Kommentar

Syntaxen tillåter att en dubbel verklig literal har ett suffix av lång typ. PowerShell behandlar det här fallet som en heltalsliteral vars värde representeras av typen [long]. Den här funktionen har bevarats för bakåtkompatibilitet med tidigare versioner av PowerShell. Programmerare avråder dock från att använda heltal i det här formuläret eftersom de enkelt kan dölja literalens faktiska värde. Till exempel 1.2L har värdet 1, 1.2345e1L har värdet 12 och 1.2345e-5L har värdet 0, varav inget är omedelbart uppenbart.

Numeriska multiplikatorer

För enkelhetens skull kan heltal och verkliga literaler innehålla en numerisk multiplikator, vilket indikerar en av en uppsättning vanliga krafter på 2. Den numeriska multiplikatorn kan skrivas i valfri kombination av versaler eller gemener.

Multiplikatorsuffixen kan användas i kombination med suffixen u, uloch l typ.

Multiplikatorexempel

PS> 1kb
1024

PS> 1.30Dmb
1363148.80

PS> 0x10Gb
17179869184

PS> 1.4e23tb
1.5393162788864E+35

PS> 0x12Lpb
20266198323167232

Acceleratorer av numerisk typ

PowerShell stöder följande typacceleratorer:

Accelerator Kommentar beskrivning
[byte] Byte (osignerad)
[sbyte] Byte (signerad)
[Int16] 16-bitars heltal
[UInt16] 16-bitars heltal (osignerat)
[Int32] 32-bitars heltal
[int] alias för [int32] 32-bitars heltal
[UInt32] 32-bitars heltal (osignerat)
[Int64] 64-bitars heltal
[long] alias för [int64] 64-bitars heltal
[UInt64] 64-bitars heltal (osignerat)
[bigint] Se BigInteger Struct
[single] Flyttal med enkel precision
[float] alias för [single] Flyttal med enkel precision
[double] Flyttal med dubbel precision
[decimal] 128-bitars flyttals

Arbeta med andra numeriska typer

Om du vill arbeta med andra numeriska typer måste du använda typacceleratorer, vilket inte är utan några problem. Till exempel parsas höga heltalsvärden alltid som dubbla innan de omvandlas till någon annan typ.

PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904

Värdet parsas som en dubbel först och förlorar precision i de högre intervallen. Undvik det här problemet genom att ange värden som strängar och sedan konvertera dem:

PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111

Exempel

Följande tabell innehåller flera exempel på numeriska literaler och visar deras typ och värde:

Antal Type Värde
100 Int32 100
100D Decimal 100
100l Int64 100
1e2 Dubbel 100
1.e2 Dubbel 100
0x1e2 Int32 482
0x1e2L Int64 482
0x1e2D Int32 7725
482D Decimal 482
482gb Int64 517543559168
0x1e2lgb Int64 517543559168

Konvertering av numerisk typ

När strängar konverteras till tal stöds ytterligare hexadecimala formatindikatorer. Dessa ytterligare format identifieras inte som literaler.

[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF

Kommandon som ser ut som numeriska literaler

Alla kommandon som ser ut som en numerisk literal måste köras med hjälp av anropsoperatorn (&), annars tolkas det som ett antal av den associerade typen.

Åtkomstegenskaper och metoder för numeriska objekt

För att få åtkomst till en medlem i en numerisk literal finns det fall då du behöver omsluta literalen inom parenteser.

  • Literalen har ingen decimalpunkt
  • Literalen har inga siffror som följer decimaltecknet
  • Literalen har inget suffix

Följande exempel misslyckas till exempel:

PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+           ~
An expression was expected after '('.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression

Följande exempel fungerar:

PS> 2L.GetType().Name
Int64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32

De första två exemplen fungerar utan att omsluta literalvärdet i parenteser eftersom PowerShell-parsern kan avgöra var den numeriska literalen slutar och GetType-metoden startar.