.NET'te ondal─▒k, de─či┼čken ve ikili aras─▒ndaki fark?


Al─▒nan cevaba git


Ne aras─▒ndaki farkt─▒r decimal , float ve double .NET?

Biri bunlardan birini ne zaman kullan─▒r?


1992





2009-03-06




Cevap say─▒s─▒n─▒ say: 16






float ve double edilir kayan ikili noktas─▒ t├╝rleri . Ba┼čka bir deyi┼čle, b├Âyle bir say─▒y─▒ temsil ederler:

 10001.10010110011
 

─░kili say─▒ ve ikili noktan─▒n konumu, de─čer i├žinde kodlan─▒r.

decimal Bir olan kayan ondal─▒k noktas─▒ t├╝r├╝ . Ba┼čka bir deyi┼čle, b├Âyle bir say─▒y─▒ temsil ederler:

 12345.65789
 

Yine, ondal─▒k basama─č─▒n numaras─▒ ve konumu hem de─čer i├žinde kodlan─▒r - bu decimal da sabit nokta t├╝r├╝ yerine hala kayan nokta t├╝r├╝n├╝ yapan ┼čeydir .

Dikkat edilmesi gereken en ├Ânemli nokta, insanlar─▒n tamsay─▒ olmayanlar─▒ ondal─▒k bi├žimde temsil etmek i├žin kullan─▒ld─▒─č─▒ ve ondal─▒k temsillerde kesin sonu├žlar bekledi─či; Ondal─▒k say─▒lar─▒n t├╝m├╝, ├Ârne─čin ikilik kayan nokta - 0.1 gibi tam olarak g├Âsterilemez, bu nedenle bir ikili kayan nokta de─čeri kullan─▒rsan─▒z, ger├žekte 0.1'e yakla┼č─▒rs─▒n─▒z. Ayr─▒ca, kayan bir ondal─▒k nokta kullan─▒rken de yakla┼č─▒k olarak bir yakla┼č─▒m elde edersiniz - ├Ârne─čin 1'e 3'e b├Âl├╝nmenin sonucu tam olarak g├Âsterilemez.

Ne zaman ne kullan─▒laca─č─▒na gelince:

  • "Do─čal olarak kesin ondal─▒k de─čerler" de─čerleri kullanmak iyidir decimal . Bu genellikle insanlar taraf─▒ndan icat edilen kavramlar i├žin uygundur: finansal de─čerler en a├ž─▒k ├Ârnektir, ancak di─čerleri de vard─▒r. ├ľrne─čin dalg─▒├žlara veya buz patencilerine verilen puan─▒ de─čerlendirin.

  • Do─čas─▒ gere─či daha fazla olan ve ger├žekten de tam olarak ├Âl├ž├╝lemeyen de─čerler i├žin , float / double daha uygundur. ├ľrne─čin, bilimsel veriler genellikle bu bi├žimde temsil edilir. Burada, orijinal de─čerler ba┼člang─▒├žta "ondal─▒k olarak do─čru" olmayacakt─▒r, bu nedenle beklenen sonu├žlar─▒n "ondal─▒k do─črulu─ču" s├╝rd├╝rmesi ├Ânemli de─čildir. Kayan ikili nokta t├╝rleri, onlarla ├žal─▒┼čmaktan ├žok daha h─▒zl─▒d─▒r.


2179







Hassasiyet temel farkt─▒r.

Kayan nokta - 7 basamak (32 bit)

Çift -15-16 hane (64 bit)

Ondal─▒k -28-29 anlaml─▒ basamak (128 bit)

Ondal─▒klar ├žok daha y├╝ksek bir hassasiyete sahiptir ve genellikle y├╝ksek derecede do─čruluk gerektiren finansal uygulamalarda kullan─▒l─▒r. Ondal─▒k say─▒lar ├žift / floattan ├žok daha yava┼č (baz─▒ testlerde 20X kat─▒na kadar).

Ondal─▒k ve Y├╝zen / ├çiftler, herhangi bir oylama olmadan kar┼č─▒la┼čt─▒r─▒lamaz, oysa Y├╝zen ve ├çiftler. Ondal─▒k ayr─▒ca kodlama veya takip eden s─▒f─▒rlara izin verir.

 float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);
 

Sonu├ž:

 float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333
 

1022







Ondal─▒k yap─▒, kesinlikle yuvarlama i├žin ho┼čg├Âr├╝s├╝z olan do─čruluk gerektiren finansal hesaplamalar i├žin tasarlanm─▒┼čt─▒r. Ondal─▒k bilimsel uygulamalar i├žin yeterli de─čildir, ancak birka├ž nedenden dolay─▒:

  • ├ľl├ž├╝len fiziksel problemin veya artefakt─▒n pratik s─▒n─▒rlar─▒ nedeniyle, bir├žok bilimsel hesaplamada belirli bir hassasiyet kayb─▒ kabul edilebilir. Finansmanda hassasiyet kayb─▒ kabul edilemez.
  • Ondal─▒k, ├žo─ču i┼člem i├žin y├╝zd├╝rme say─▒s─▒ndan ├žok daha yava┼čt─▒r ve iki kat daha fazlad─▒r, ├ž├╝nk├╝ esas olarak kayan nokta i┼člemleri ikili olarak yap─▒l─▒r, oysa 10 taban─▒ndaki Onlu say─▒lar yap─▒l─▒r (├Ârne─čin, kayan nokta ve ├žiftler, MMX / SSE gibi FPU donan─▒m─▒ taraf─▒ndan ele al─▒n─▒r) oysa yaz─▒l─▒mda ondal─▒k say─▒lar hesaplan─▒r).
  • Ondal─▒k, daha fazla hassasiyet basama─č─▒n─▒ desteklese de, iki kattan kabul edilemez derecede daha k├╝├ž├╝k bir de─čer aral─▒─č─▒na sahiptir. Bu nedenle, Ondal─▒k bir├žok bilimsel de─čeri temsil etmek i├žin kullan─▒lamaz.

78







 +---------+----------------+---------+----------+---------------------------------------------+
| C#      | .Net Framework | Signed? | Bytes    | Possible Values                             |
| Type    | (System) type  |         | Occupied |                                             |
+---------+----------------+---------+----------+---------------------------------------------+
| sbyte   | System.Sbyte   | Yes     | 1        | -128 to 127                                 |
| short   | System.Int16   | Yes     | 2        | -32768 to 32767                             |
| int     | System.Int32   | Yes     | 4        | -2147483648 to 2147483647                   |
| long    | System.Int64   | Yes     | 8        | -9223372036854775808 to 9223372036854775807 |
| byte    | System.Byte    | No      | 1        | 0 to 255                                    |
| ushort  | System.Uint16  | No      | 2        | 0 to 65535                                  |
| uint    | System.UInt32  | No      | 4        | 0 to 4294967295                             |
| ulong   | System.Uint64  | No      | 8        | 0 to 18446744073709551615                   |
| float   | System.Single  | Yes     | 4        | Approximately ┬▒1.5 x 10-45 to ┬▒3.4 x 1038   |
|         |                |         |          |  with 7 significant figures                 |
| double  | System.Double  | Yes     | 8        | Approximately ┬▒5.0 x 10-324 to ┬▒1.7 x 10308 |
|         |                |         |          |  with 15 or 16 significant figures          |
| decimal | System.Decimal | Yes     | 12       | Approximately ┬▒1.0 x 10-28 to ┬▒7.9 x 1028   |
|         |                |         |          |  with 28 or 29 significant figures          |
| char    | System.Char    | N/A     | 2        | Any Unicode character (16 bit)              |
| bool    | System.Boolean | N/A     | 1 / 2    | true or false                               |
+---------+----------------+---------+----------+---------------------------------------------+
 

Daha fazla bilgi i├žin, bkz.
Http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/921a8ffc-9829-4145-bdc9-a96c1ec174a5


71


2013-06-07





float 7 basamak hassasiyet

double 15 basamak hassasiyete sahiptir

decimal 28 basamak hassasiyete sahiptir

Daha iyi bir do─črulu─ča ihtiyac─▒n─▒z varsa, ┼čamand─▒ra yerine ├žift kullan─▒n. Modern CPU'larda her iki veri t├╝r├╝ de neredeyse ayn─▒ performansa sahip. ┼×amand─▒ra kullanman─▒n tek yarar─▒, daha az yer kaplamalar─▒d─▒r. Pratikte yaln─▒zca bir├žo─čunuz varsa ├Ânemlidir.

Bunu ilgin├ž buldum. Her Bilgisayar Bilim ─░nsan─▒n─▒n Kayan Nokta Aritmeti─či Hakk─▒nda Bilmeleri Gerekenler


46







Di─čer cevaplarda ve yorumlarda zaten cevaplanm─▒┼č tonlarca iyi (ve baz─▒ k├Ât├╝) bilgileri tekrarlamayaca─č─▒m, ancak takip sorunuza bir ipucu ile cevap verece─čim:

Biri bunlardan birini ne zaman kullan─▒r?

Say─▒lan de─čerler i├žin ondal─▒k kullan─▒n

├ľl├ž├╝len de─čerler i├žin ┼čamand─▒ra / ├žift kullan─▒n

Baz─▒ ├Ârnekler:

  • para (para sayar veya para ├Âl├žer miyiz?)

  • mesafe (mesafeyi say─▒yor muyuz veya mesafeyi ├Âl├ž├╝yor muyuz? *)

  • puanlar─▒ (puanlar─▒ say─▒yor muyuz veya puanlar─▒ ├Âl├ž├╝yor muyuz?)

Her zaman para sayar─▒z ve asla ├Âl├žmemeliyiz. Genellikle mesafeyi ├Âl├žeriz. S─▒k s─▒k puanlar─▒ sayar─▒z.

* Baz─▒ durumlarda, nominal mesafe dedi─čim ┼čey, ger├žekten mesafeyi 'saymak' isteyebiliriz. ├ľrne─čin, belki de ┼čehirlere olan mesafeleri g├Âsteren ├╝lke i┼čaretleriyle u─čra┼č─▒yoruz ve bu mesafelerin asla birden fazla ondal─▒k basama─ča sahip olmad─▒─č─▒n─▒ biliyoruz (xxx.x km).


42







Kimse bundan bahsetmedi

Varsay─▒lan ayarlarda, Floats (System.Single) ve double'ler (System.Double) hi├žbir zaman ta┼čma kontrol├╝n├╝ kullanmaz, Ondal─▒k (System.Decimal) ise her zaman ta┼čma kontrol├╝n├╝ kullan─▒r.

Demek istedi─čim

 decimal myNumber = decimal.MaxValue;
myNumber += 1;
 

OverflowException'─▒ atar .

Ancak bunlar yok:

 float myNumber = float.MaxValue;
myNumber += 1;
 

&

 double myNumber = double.MaxValue;
myNumber += 1;
 

35







Tamsay─▒lar, bahsedildi─či gibi, tam say─▒lard─▒r. Noktay─▒, 7, 0,42 ve 0,007 gibi bir ┼čey depolayamazlar. Tam say─▒ olmayan numaralar─▒ kaydetmeniz gerekiyorsa, farkl─▒ bir de─či┼čkene ihtiyac─▒n─▒z vard─▒r. ├çift tipi ya da ┼čamand─▒ra tipini kullanabilirsiniz. Tam olarak ayn─▒ ┼čekilde yukar─▒ de─či┼čkenlerin bu t├╝r ayarlay─▒n: yerine kelime kullanman─▒n int , yazarken double veya float . Bunun gibi:

 float myFloat;
double myDouble;
 

( float "kayan nokta" i├žin k─▒sad─▒r ve sonunda bir nokta olan bir say─▒ anlam─▒na gelir.)

─░kisi aras─▒ndaki fark, tutabilecekleri say─▒lar─▒n boyutundad─▒r. ├ç├╝nk├╝ float numaran─▒zda en fazla 7 hane olabilir. ─░├žin double s, 16 haneye kadar olabilir. Daha kesin olmak gerekirse, i┼čte resmi boyut:

 float:  1.5 ├Ś 10^-45  to 3.4 ├Ś 10^38  
double: 5.0 ├Ś 10^-324 to 1.7 ├Ś 10^308
 

float 32 bit bir say─▒d─▒r ve double 64 bit bir say─▒d─▒r.

Kod almak i├žin yeni d├╝─čmesine ├žift t─▒klay─▒n. D├╝─čme kodunuza a┼ča─č─▒daki ├╝├ž sat─▒r─▒ ekleyin:

 double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());
 

Program─▒n─▒z─▒ durdurun ve kodlama penceresine d├Ân├╝n. Bu sat─▒r─▒ de─či┼čtir:

 myDouble = 0.007;
myDouble = 12345678.1234567;
 

Program─▒n─▒z─▒ ├žal─▒┼čt─▒r─▒n ve ├žift d├╝─čmesine t─▒klay─▒n. Mesaj kutusu numaray─▒ do─čru g├Âr├╝nt├╝ler. Yine de sonuna ba┼čka bir numara ekleyin ve C # tekrar yukar─▒ ya da a┼ča─č─▒ yuvarlanacakt─▒r. Ahlaki do─čruluk istiyorsan─▒z, yuvarlama dikkatli olun!


29







  1. ─░kili ve kayan nokta, hem derleme hem de ├žal─▒┼čma zaman─▒nda bir istisna olmadan tamsay─▒ s─▒f─▒ra b├Âl├╝nebilir.
  2. Ondal─▒k, tamsay─▒ s─▒f─▒ra b├Âl├╝nemez. Bunu yaparsan─▒z derleme her zaman ba┼čar─▒s─▒z olur.

28







  • ┼čamand─▒ra: ┬▒ 1.5 x 10 ^ - 45 - ┬▒ 3.4 x 10 ^ 38 (~ 7 ├Ânemli rakam
  • ├žift: ┬▒ 5.0 x 10 ^ -324 ila ┬▒ 1.7 x 10 ^ 308 (15-16 anlaml─▒ rakam)
  • ondal─▒k: ┬▒ 1,0 x 10 ^ -28 ila ┬▒ 7.9 x 10 ^ 28 (28-29 ├Ânemli rakamlar)

15







Bu benim i├žin ilgin├ž bir konu oldu, bug├╝n oldu─ču gibi, a'dan decimal daha az hassasiyete sahip oldu─čumuz i├žin k├Ât├╝ bir hata yapt─▒k float .

C # kodumuzda, bir Excel elektronik tablosundan say─▒sal de─čerleri okuyor, bunlar─▒ a'ya d├Ân├╝┼čt├╝r├╝yoruz decimal , sonra bunu decimal bir SQL Server veritaban─▒na kaydetmek i├žin bir Servise geri g├Ânderiyoruz .

 Microsoft.Office.Interop.Excel.Range cell = ÔÇŽ
object cellValue = cell.Value2;
if (cellValue != null)
{
    decimal value = 0;
    Decimal.TryParse(cellValue.ToString(), out value);
}
 

┼×imdi, neredeyse t├╝m Excel de─čerlerimiz i├žin, bu g├╝zel ├žal─▒┼čt─▒. Ancak baz─▒, ├žok k├╝├ž├╝k Excel de─čerleri i├žin, kullan─▒m─▒ decimal.TryParse tamamen de─čerini kaybetti. B├Âyle bir ├Ârnek

  • cellValue = 0.00006317592

  • Decimal.TryParse (cellValue.ToString (), ├ž─▒k─▒┼č de─čeri); // 0 d├Ând├╝r├╝r

├ç├Âzelti, tuhaf bir Excel de─čerlerini d├Ân├╝┼čt├╝rmek i├žin oldu double bir i├žine daha sonra ilk ve decimal :

 Microsoft.Office.Interop.Excel.Range cell = ÔÇŽ
object cellValue = cell.Value2;
if (cellValue != null)
{
    double valueDouble = 0;
    double.TryParse(cellValue.ToString(), out valueDouble);
    decimal value = (decimal) valueDouble;
    ÔÇŽ
}
 

A'dan double daha az kesinli─če sahip olmas─▒na ra─čmen decimal , bu asl─▒nda k├╝├ž├╝k say─▒lar─▒n tan─▒nmas─▒n─▒ sa─člam─▒┼čt─▒r. Baz─▒ nedenlerden dolay─▒, double.TryParse asl─▒nda bu kadar k├╝├ž├╝k say─▒lar─▒ alabilmi┼č, oysa decimal.TryParse onlar─▒ s─▒f─▒ra ayarlayabilecekti.

Garip. Çok tuhaf.


13







Hem bellek hem de performans─▒n kritik oldu─ču oyunlar ve g├Âm├╝l├╝ sistemler gibi uygulamalar i├žin, y├╝zd├╝rme genellikle daha h─▒zl─▒ ve iki kat─▒n─▒n yar─▒s─▒ kadar oldu─ču i├žin say─▒sal se├žimdir. Tamsay─▒lar tercih edilen silaht─▒, ancak kayan nokta performans─▒ modern i┼člemcilerde tamsay─▒y─▒ ├╝stlendi. Ondal─▒k bitti!


8


2014-05-16





Ondal─▒k, ├çift ve De─či┼čken de─či┼čken t├╝rleri, de─čerleri kaydetme bi├žimleri bak─▒m─▒ndan farkl─▒d─▒r. Hassasiyet, ┼čamand─▒ran─▒n tek duyarl─▒kl─▒ (32 bit) kayan nokta veri t├╝r├╝, ├žiftin ├žift duyarl─▒l─▒k (64 bit) kayan nokta veri t├╝r├╝ ve ondal─▒k say─▒s─▒n─▒n 128 bit kayan nokta veri t├╝r├╝ oldu─ču ana farkt─▒r.

Kayan nokta - 32 bit (7 basamak)

Çift - 64 bit (15-16 basamak)

Ondal─▒k - 128 bit (28-29 anlaml─▒ basamak)

Daha fazlas─▒ i├žin ... Ondal─▒k, Kayan Nokta ve ─░kili aras─▒ndaki fark


7







T├╝m bu tiplerle ilgili sorun, kesin olmayan bir kesinli─čin var olmas─▒ ve bu sorunun a┼ča─č─▒daki ├Ârnekte oldu─ču gibi k├╝├ž├╝k ondal─▒k say─▒larla ortaya ├ž─▒kmas─▒d─▒r.

 Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1

If fMean - fDelta < fLimit Then
    bLower = True
Else
    bLower = False
End If
 

Soru: bLower de─či┼čkeni hangi de─čeri i├žerir?

Cevap: 32 bitlik bir makinede bLower TRUE !!!

Double ile Ondal─▒k de─či┼čtirirsem, bLower en iyi cevap olan YANLI┼× i├žeriyor.

├çift olarak sorun ┼ču ki, fMean-fDelta = 1.09999999999, 1.1'den d├╝┼č├╝k.

Dikkat: Ondal─▒k, sadece y├╝ksek hassasiyete sahip bir ikili oldu─čundan ve hassasiyetin her zaman bir s─▒n─▒r─▒ oldu─ču i├žin kesinlikle ayn─▒ sorunun di─čer numaralar i├žin de mevcut olabilece─čini d├╝┼č├╝n├╝yorum.

Asl─▒nda, Double, Float ve Decimal, COBOL'da BINARY ondal─▒k basama─ča kar┼č─▒l─▒k gelir!

COBOL'de uygulanan di─čer say─▒sal t├╝rlerin .Net'te bulunmamas─▒ ├╝z├╝c├╝d├╝r. COBOL bilmeyenler i├žin, say─▒sal tipten sonra COBOL'da bulunmaktad─▒r.

 BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte) 
 

5







Basit bir deyi┼čle:

  1. Ondal─▒k, ├çift ve De─či┼čken de─či┼čken t├╝rleri, de─čerleri kaydetme bi├žimleri bak─▒m─▒ndan farkl─▒d─▒r.
  2. Hassasiyet, temel farkt─▒r (bu tek fark de─čildir), ┼čamand─▒ran─▒n tek bir hassas (32 bit) kayan nokta veri t├╝r├╝, ├žift , ├žift duyarl─▒k (64 bit) kayan nokta veri t├╝r├╝ ve ondal─▒k , 128-bit'tir. kayan nokta veri t├╝r├╝.
  3. ├ľzet tablosu:

 /==========================================================================================
    Type       Bits    Have up to                   Approximate Range 
/==========================================================================================
    float      32      7 digits                     -3.4 ├Ś 10 ^ (38)   to +3.4 ├Ś 10 ^ (38)
    double     64      15-16 digits                 ┬▒5.0 ├Ś 10 ^ (-324) to ┬▒1.7 ├Ś 10 ^ (308)
    decimal    128     28-29 significant digits     ┬▒7.9 x 10 ^ (28) or (1 to 10 ^ (28)
/==========================================================================================
 
Burada daha fazla okuyabilirsiniz , Float , Çift ve Ondalık .


4


2018-02-10





Bunlar─▒n her biri aras─▒ndaki temel fark, hassasiyettir.

float Bir olan 32-bit say─▒, double bir oldu─čunu 64-bit numaras─▒ ve decimal bir oldu─čunu 128-bit numaras─▒.


3



─░lgili yay─▒nlar


Npm package.json dosyas─▒ndaki ba─č─▒ml─▒l─▒klar, devDependencies ve peerDependencies aras─▒ndaki fark nedir?

PHP'de tek t─▒rnakl─▒ ve ├žift t─▒rnakl─▒ dizeler aras─▒ndaki fark nedir?

Java'daki getPath (), getAbsolutePath () ve getCanonicalPath () aras─▒ndaki fark nedir?

Python'da soyut s─▒n─▒f ile aray├╝z aras─▒ndaki fark

Kal─▒c─▒l─▒k API's─▒nda FetchType LAZY ile EAGER aras─▒ndaki fark nedir?

NgModuleÔÇÖda bildirimler, sa─člay─▒c─▒lar ve ithalat aras─▒ndaki fark nedir?

JavaScriptÔÇÖte Ertelenmi┼č, S├Âz Verdi─čimiz ve Gelecek aras─▒ndaki farklar nelerdir?

SQL Server'da say─▒sal, de─či┼čken ve ondal─▒k aras─▒ndaki fark

Bir deneme yakalamada At─▒labilir ve ─░stisna kullan─▒m─▒ aras─▒ndaki fark

CommonJs Mod├╝l Sisteminde ÔÇťmodule.exportsÔÇŁ ve ÔÇťexportÔÇŁ aras─▒ndaki fark

Etiketle ilgili di─čer sorular [.net]


Neden ÔÇťnamespace std;ÔÇŁ kullanmak k├Ât├╝ uygulama olarak kabul edilir?

'Se├ž' kutusu i├žin yer tutucuyu nas─▒l yapar─▒m?

Bir int32 i├žin maksimum de─čer nedir?

De─či┼čkenler neden bir switch ifadesinde bildirilemiyor?

Mevcut y─▒l─▒ JavaScript ile al─▒n

Bak─▒n─▒z: Chrome Geli┼čtirici Ara├žlar─▒'ndaki hover state

define () vs. const

JavaScript neden yaln─▒zca IEÔÇÖdeki geli┼čtirici ara├žlar─▒n─▒ a├žt─▒ktan sonra ├žal─▒┼č─▒yor?

C# SQL Server DataTypes e┼čde─čeri

.NET kodunu tersine m├╝hendislikten korumak ister misiniz?