Decimal values via get_option() with custom local (decimal point = comma)

get_option() always returns a string. That has nothing to do with whether setlocale() has been used. Options are all stored in the option_value column of wp_options, which is a text column. Your float is likely being formatted for your locale when it tries to insert a float into the text column.

Your problem is that you’re treating version numbers as floats, which is incorrect. They might look like floats, but version numbers are strings. For example, a float 5.2 is higher than 5.15, but 5.15 is a higher version number than 5.2.

So you can’t compare version numbers by using < or > on floats. You need to use strings, and version_compare() to compare them. So first make sure to set the value as a string:

update_option( 'my_db_version', '5.13' );

Also note that db_version is an option already used by WordPress core, you need to prefix your options with something unique to your project.

Then you can compare the values like this:

$current_version = get_option( 'my_db_version' );
$new_version     = '5.39'; // String

// If the current version is lower than the new version...
if ( version_compare( $current_version, $new_version ) < 0 ) { 
    // ...update to the new version.
    update_option( 'my_db_version', $new_version );
}