Podczas konwersji danych binarnych do wartości pływaków za pomocą metody Ruby's {X0}} otrzymuję następujące wyniki:

[0x7d, 0xe8, 0x80, 0xc5].map(&:chr).join.unpack('e')[0]
# => -4125.06103515625

Jest to uważane za prawidłowy wynik.

Korzystanie z metody C # {{X0} Dostaję następujący wynik:

var firstVal = BitConverter.ToSingle(new byte[] {0x7d, 0xe8, 0x80, 0xc5}, 0);
// firstVal: -4125.061

Wydaje się więc, że wartość jest w jakiś sposób ścięta. Czy istnieje sposób na wyodrębnienie prawidłowej wartości (jak w przykładzie ruby) z reprezentacji binarnej?

2
verm-luh 26 październik 2020, 10:21

1 odpowiedź

Najlepsza odpowiedź

Jak pamiętam, Ruby ma tylko jeden typ pływaka, a to jest podwójnie precyzyjny pływak. Więc rodzaj wartości twojego wyrażenia ruby jest podwójnie precyzyjny pływak, którego analogowy w C # jest "podwójny". Więc jeśli chcesz uzyskać dokładnie ten sam numer, możesz to zrobić (ale nie jestem pewien, czy rzeczywiście ma znacznie sens, patrz @xanatos Komentarz):

var firstVal = (double) BitConverter.ToSingle(new byte[] {0x7d, 0xe8, 0x80, 0xc5}, 0); 
// firstVal is -4125.06103515625
1
Evk 26 październik 2020, 07:49