Skocz do zawartości

Typ FLOAT - 4.60 a 4.6


Sanchez Spinoza

Rekomendowane odpowiedzi

Gdy dodaje do MySQL jakiś rekord w typi FLOAT np. 4.60 to dopisując do bazy ten rekord baza automatycznie

usuwa mi to zero na końcu. Da się tak zrobić żeby baza nie usuwała automatycznie zera na końcu?

Profesjonalne publikacje Content Marketingowe - zamów online na BlackHood.pl 

Szeroki wybór Łożysk samochodowych

Polecam również Praca Bielsko

Odnośnik do komentarza
Udostępnij na innych stronach

Takie rzeczy to się robi na warstwie prezentacji danych a zresztą co Ci dokładnie usuwa te ZERO ? Zapytanie SQL czy PHP ?

W zależności czego używasz do prezentacji danych to robi sie to róznymi metodami:

w SQL są funkcje do formatowania wyniku

w PHP sa funkcje do formatowania wyniku

w Delphi są funkcje do formatowania wyniku

4.60 to to samo co 4.6 tylko inaczej zaprezentowane dla usera :angry:

Odnośnik do komentarza
Udostępnij na innych stronach

Szczerze mówiąc to korzystam z tej bazy w takiej aplikacji w Delphi i tam chcę wyświetlić cenę netto np. 4,60.

Aplikacja ta pobiera mi czysty wynik z bazy czyli obcięte 4,60 na 4,6. A ja chce żeby było to zero widoczne.

Myślałem że to w ustawieniach bazy lub zastosowanie odpowiedniego typu powoduje że tego zera mi nie kasuje.

To w takim razie jakby to zapisać powiedzmy w PHP żeby przy pobieraniu

rekordu o wartości 4,6 dodał to zero na końcu? Jakąś funkcją to zrobić?

W Pascalu może będzie podobnie.

Edt.

Aha, teraz zauważyłem że piszesz o Delphi i funkcjach formatowania. Nie orientujesz się przypadkiem jaka to funkcja? :angry:

Profesjonalne publikacje Content Marketingowe - zamów online na BlackHood.pl 

Szeroki wybór Łożysk samochodowych

Polecam również Praca Bielsko

Odnośnik do komentarza
Udostępnij na innych stronach

Najlepiej skorzystać z wbudowanych mechanizmów w Delphi.

Musisz ustawić własciwość "DISPLAYFORMAT" dla pola

plik PAS:

unit Unit7;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DB, Grids, DBGrids, DBTables, StdCtrls;

type
 TForm7 = class(TForm)
Table1: TTable;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Table1CustNo: TFloatField;
Button1: TButton;
procedure Button1Click(Sender: TObject);
 private
{ Private declarations }
 public
{ Public declarations }
 end;

var
 Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.Button1Click(Sender: TObject);
begin
 Table1CustNo.DisplayFormat := '.00';
end;

end.

plik formy:

object Form7: TForm7
 Left = 0
 Top = 0
 Caption = 'Form7'
 ClientHeight = 293
 ClientWidth = 426
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object DBGrid1: TDBGrid
Left = 32
Top = 136
Width = 377
Height = 129
DataSource = DataSource1
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'Tahoma'
TitleFont.Style = []
 end
 object Button1: TButton
Left = 144
Top = 48
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 1
OnClick = Button1Click
 end
 object Table1: TTable
Active = True
DatabaseName = 'DBDEMOS'
TableName = 'customer.db'
Left = 32
Top = 40
object Table1CustNo: TFloatField
  FieldName = 'CustNo'
end
 end
 object DataSource1: TDataSource
DataSet = Table1
Left = 40
Top = 88
 end
end

Odnośnik do komentarza
Udostępnij na innych stronach

Pasuje mi to rozwiązanie.

Tylko jak je umieścić w moim kodzie.

Oto kod:

...
ListItem.SubItems.Add(FloatToStr(RoundTo(SQL.FieldValues['CenaNetto'],-2)));
...

I właśnie to pole FieldValues['CenaNetto'] chciałbym by wyświetlało się z dwoma miejscami po przecinku.

Funkcja RoundTo dobrze się sprawdza gdy w bazie jest liczba np. 10.3556 wtedy zaokrągla do 10.35

ale jak mam to przykładowe 4,60 to mi pisze 4,6.

Jak ten typ TFloatField przystosować do tej części kodu?

Ten fragment to fragment z pętli pobierającej dane z bazy MySQL. Więc jak tam wtrącić pole TFloatField to nie za bardzo rozumiem :)

Przypisać to do zmiennej?

Profesjonalne publikacje Content Marketingowe - zamów online na BlackHood.pl 

Szeroki wybór Łożysk samochodowych

Polecam również Praca Bielsko

Odnośnik do komentarza
Udostępnij na innych stronach

Ja nie używam FieldValues z powodu szybkości

Note:

Because FieldValues always uses Variants, it may be a somewhat slower method of accessing data, than using a field's native format (for example, using a field's AsXXX property), especially in applications that process large amounts of data.

W Twoim kodzie wystarczyło by to zrobić tak np.

ListItem.SubItems.Add(format('%8.2f',[SQL.FieldValues['CenaNetto']]));

lub inczej zapisane

LICZBA: DOUBLE;
STR:STRING;

LICZBA=SQL.FieldValues['CenaNetto'];
STR= format('%8.2f',[LICZBA]);
ListItem.SubItems.Add(STR);

A jeszcze inaczej to ja bym to zrobił tak:

(SQL.FieldByName('CenaNetto') as TFloatField). DisplayFormat := '.00';
ListItem.SubItems.Add(SQL.FieldByName('CenaNetto').asString);

Odnośnik do komentarza
Udostępnij na innych stronach

Float to kiepski pomysł na trzymanie danych walutowych, mogą być przekłamania przy dokonywaniu obliczeń. W bazie to albo trzeba trzymać ilość "najniżeszej" jednostki (grosze) albo używać typu currency/decimal który gwarantuje, że obliczenia będą poprawne.

Z dokumentacji PHP:

So never trust floating number results to the last digit and never compare floating point numbers for equality. If you really need higher precision, you should use the arbitrary precision math functions or gmp functions instead.

Z dokumentacji SQL

The FLOAT and DOUBLE data types are floating-point types and calculations are approximate

Jak będziesz od tych wartości na przykład obliczał podatek to nie ma żadnej gwarancji że otrzymasz dobre wyniki. Dokładność liczb zmiennoprzecinkowych maleje wraz z ich oddaleniem się od 0 (tzn. jest zachowany procent dokładności, np. 0.0001 to 0.0001 ale 316666.00001 będzie na przykład 316666.00009123)

https://dev.mysql.com/doc/refman/5.1/en/pre...h-examples.html

W mySQL jak masz floaty i porównasz 0.1 + 0.2 to się to nie równa 0.3!

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności