E is for exponent and (a very long time ago) D for a double precision exponent.
I recommend using SETTableVariable; it behaves the way I'd expect: stores a number as a number and a string as a string and creates a table variable only if it isn't already there.
NEWTableVariable adds a suffix to the name if it already exists and, (the unexpected behavior), converts strings that look like numbers to numbers.
To further confuse things, dt<<GETTableVariable("name") returns a string, even if the value is numeric.
I recommend using dt:name to get the numeric value or the string value that is stored.
dt = New Table("Table");
dt << new Table Variable("a", char(17)); // 17 vs char(17)
show(dt:a,dt<<gettablevariable("a"));
dt<<settablevariable("a",42.42);
show(dt:a,dt<<gettablevariable("a"));
dt<<settablevariable("a","hello");
show(dt:a,dt<<gettablevariable("a"));
dt<<settablevariable("a",42.42);
show(dt:a,dt<<gettablevariable("a"));
dt:a = 17; <<< converted to a number
dt << gettablevariable("a") = "17"; <<< but fetched as a string !?!?!
dt:a = 42.42; <<< stored a number as expected
dt << gettablevariable("a") = "42.42"; <<< ?!?!? always returns a string
dt:a = "hello"; <<< stored a string as expected
dt << gettablevariable("a") = "hello"; <<< well, ok
dt:a = 42.42;
dt << gettablevariable("a") = "42.42";
Craige