Jak mogę sprawdzić, czy 204/5 jest większe niż 200/5? Doświadczyłem trudności, gdy próbowałem tego, używając zarówno matematyki zmiennoprzecinkowej, jak i dziesiętnej.Problemy z dzieleniem w C#
Odpowiedz
dołączenie .0
lub f
do dowolnej liczby zmusza język zinterpretować tę liczbę jako zmiennoprzecinkowej przecinku:
204
jest liczbą całkowitą,204f
jest pojedynczej precyzji zmiennoprzecinkową po przecinku i204.0
jest podwójnej precyzji zmiennoprzecinkową dziesiętny.
Dlatego 204/5
zwraca liczbę całkowitą 40
i 204.0/5
Zwraca podwójnej precyzji pływak 40.8
.
if (204.0/5 > 200.0/5) {
// stuff
}
Lub, można podjąć matematycznie prostszą trasę:
if (204 > 200) {
// because you're dividing both of them by 5
}
CPU nie przekształcone. Po prostu mówi kompilatorowi, jaki rodzaj kodu jest ogólny, aby poradzić sobie z liczbami (jako liczby całkowite, zmienne, podwójne itd.). – siride
@side - Absolutnie racja. Edytowane. – amphetamachine
if ((204.0/5.0) > (200.0/5.0)) {
//do stuff!
}
Korzystanie pływaka lub dziesiętną będzie pracy ... ale trzeba wykonać arytmetyczną pływających punkt, tworząc co najmniej jeden z operandów dziesiętny/zmienny/podwójny:
decimal x = ((decimal) 204)/5;
decimal y = ((decimal) 200)/5;
if (x > y) // Yes!
lub użyć pływające literały punktowe:
decimal x = 204m/5;
decimal y = 200m/5;
to nie ma znaczenia który argument jest zmiennoprzecinkowych:
decimal x = 204/5m;
decimal y = 200/5m;
pływaka/podwójne działać tak samo dobrze:
double x = 204d/5;
double y = 200d/5;
Co się dzieje, jeśli używasz tylko 204/5? Rozważmy to stwierdzenie:
double x = 204/5;
Kompilator nie używa typu zmiennej do określenia typu prawej strony. Wynika z tego, że prawa strona to tylko liczba całkowita, uzyskana przez podzielenie dwóch liczb całkowitych. Wynik jest następnie przekształcany na double
i przypisywany do x
. Problem polega na tym, że arytmetyka jest wykonywana tylko z liczbami całkowitymi, podczas gdy chcesz, aby konwersja na punkt zmiennoprzecinkowy była wykonywana wcześniej, abyś mógł otrzymać wynik zmiennoprzecinkowy.
Powodem jest, że przy próbie obliczenia 204/5
, to jest dokładnie obliczanie int 204 divides int 5
, wynik jest również int
w języku C#. Możesz spróbować 204m/5
, otrzymasz poprawną odpowiedź.
if (((float)(204)/5) > ((float)(200)/5))
{
//Enter code here
}
else
{
//Enter code here
}
- 1. C++: Problemy z konstruktorem
- 2. Problem z dzieleniem odczytu/zapisu do pracy z PHP mysqlnd_ms
- 3. Problemy z pętlą walidacji C++
- 4. Problemy z instalacją C# wdrożenia
- 5. Możliwe problemy z NOMINMAX w Visual C++
- 6. CARET. Relacja między dzieleniem danych a trainControl
- 7. Problemy z łączeniem C# z EC2
- 8. Bufory protokołów, uzyskanie C#, aby porozmawiać z C++: problemy typu i problemy z schematem
- 9. C++ Boost.Python: 2 problemy
- 10. Problemy z kompilacją ZMQ dla przykładów C++
- 11. Objective-c: Problemy z blokami i NSEnumerationConcurrent
- 12. Problemy z CMake i Visual C++ 2010
- 13. .NET/C# problemy z serializacją dziesiętną
- 14. Problemy z nadpisaniami funkcji częściowej klasy w języku C++
- 15. Jak rozwiązywać problemy z wyciekiem rączek w C# Windows Service
- 16. Osadzanie Pythona w C: Problemy z importowaniem lokalnych modułów
- 17. Problemy z const w C kiedy posiadające typedef i tablicę
- 18. Problemy z tokenize
- 19. Problemy z wyrównaniem Eigen
- 20. Problemy z sesją PHP
- 21. Jak rozwiązywać problemy HackerRank w Objective-C
- 22. Problemy wyświetlające śledzenie stosu C# w WinDbg
- 23. Problemy z kontrawariancji w Scala
- 24. Problemy z łączeniem sqlite3
- 25. Problemy z glewami, nierozwiązane problemy zewnętrzne
- 26. Problemy z powiększeniem API
- 27. Problemy z dużym QImage
- 28. Problemy z kompilacją pshtoolkit
- 29. Problemy z std :: Chrono
- 30. Problemy z testem Połączenia
(rzeczywista) 200/(rzeczywista) 5 <(rzeczywista) 204/(rzeczywista) 5 – FFox